voku/html-form-validator

无麻烦的HTML <form>验证,轻松过滤和验证。

3.0.1 2021-12-08 15:34 UTC

This package is auto-updated.

Last update: 2024-09-03 02:22:47 UTC


README

Build Status Coverage Status Codacy Badge Latest Stable Version Total Downloads License Donate to this project using Paypal Donate to this project using Patreon

🔦 HTMLFormValidation

描述

HtmlFormValidator是一个易于使用的PHP库,可以帮助您验证您的

数据,并且您可以独立于您选择的框架使用它。

通过"composer require"安装

composer require voku/html-form-validator

这是如何工作的?

  1. 首先,您需要生成一个HTML表单,这完全取决于您。您可以手动编写,也可以使用框架或库生成,这无关紧要。

  2. 然后,我们使用DOM解析通过voku/simple_html_dom来检测当前的验证器和直接从HTML中的过滤规则。

  3. 最后,我们使用Respect/Validation来验证表单。

简单示例

use voku\HtmlFormValidator\Validator;

require_once 'composer/autoload.php';

$html = '
<form id="music" method="post">
  <label>Artist:
    <select name="top5" required="required">
      <option>Heino</option>
      <option>Michael Jackson</option>
      <option>Tom Waits</option>
      <option>Nina Hagen</option>
      <option>Marianne Rosenberg</option>
    </select>
  </label>
</form>
';

$rules = $formValidator->getAllRules();
static::assertSame(
    [
        'music' => [
            'top5' => 'in(' . \serialize(['Heino','Michael Jackson','Tom Waits','Nina Hagen','Marianne Rosenberg',]) . ')',
        ],
    ],
    $rules
);

// --- valid

// fake some data
$_POST = [
    'top5' => 'Heino',
];
$formValidatorResult = $formValidator->validate($_POST);
static::assertSame([], $formValidatorResult->getErrorMessages());

// --- invalid

// fake some data
$_POST = [
    'top5' => 'fooooo',
];
$formValidatorResult = $formValidator->validate($_POST);
static::assertSame(
    [
        'top5' => [
            '"fooooo" must be in { "Heino", "Michael Jackson", "Tom Waits", "Nina Hagen", "Marianne Rosenberg" }',
        ],
    ],
    $formValidatorResult->getErrorMessages()
);

扩展示例

use voku\HtmlFormValidator\Validator;

require_once 'composer/autoload.php';

$html = '
<form id="register" method="post">
    <label for="email">Email:</label>
    <input
        type="email"
        id="email"
        name="user[email]"
        value=""
        data-validator="email"
        data-filter="trim"
        data-error-class="error-foo-bar"
        data-error-message--email="Your email [%s] address is not correct."
        data-error-template-selector="span#email-error-message-template"
        required="required"
    >
    <span style="color: red;" id="email-error-message-template"></span>
    
    <label for="username">Name:</label>
    <input
        type="text"
        id="username"
        name="user[name]"
        value=""
        data-validator="notEmpty|maxLength(100)"
        data-filter="strip_tags(<p>)|trim|escape"
        data-error-class="error-foo-bar"
        data-error-template-selector="span#username-error-message-template"
        required="required"
    >
    <span style="color: red;" id="username-error-message-template"></span>
    
    <label for="date">Date:</label>
    <input 
        type="text"
        id="date"
        name="user[date]"
        value=""
        data-validator="dateGerman|notEmpty"
        data-filter="trim"
        data-error-class="error-foo-bar"
        data-error-message--dateGerman="Date is not correct."
        data-error-message--notEmpty="Date is empty."
        data-error-template-selector="span#date-error-message-template"
        required="required"
    >
    <span style="color: red;" id="date-error-message-template"></span>
    
    <button type="submit">submit</button>
</form>
';

$formValidator = new Validator($html);

// fake some data
$_POST = [
    'user' => [
        'email' => 'foo@isanemail',
        'name'  => 'bar',
    ],
];

// validate the form
$formValidatorResult = $formValidator->validate($_POST);

// check the result
static::assertFalse($formValidatorResult->isSuccess());

// get the error messages
static::assertSame(
    [
        'user[email]' => ['Your email [foo@isanemail] address is not correct.'],
        'user[date]'  => [
            'Date is not correct.',
            'Date is empty.',
        ],
    ],
    $formValidatorResult->getErrorMessages()
);

// get the new html
static::assertSame(
    '
    <form id="register" method="post">
        <label for="email">Email:</label>
        <input 
                type="email" 
                id="email" 
                name="user[email]" 
                value="" 
                data-validator="email" 
                data-filter="trim" 
                data-error-class="error-foo-bar" 
                data-error-message--email="Your email [%s] address is not correct." 
                data-error-template-selector="span#email-error-message-template" 
                required="required" 
                aria-invalid="true"
        >            
        <span style="color: red;" id="email-error-message-template">Your email [foo@isanemail] address is not correct.</span>
                                
        <label for="username">Name:</label>
        <input 
                type="text" 
                id="username" 
                name="user[name]" 
                value="bar" 
                data-validator="notEmpty|maxLength(100)" 
                data-filter="strip_tags(<p>)|trim|escape" 
                data-error-class="error-foo-bar" 
                data-error-template-selector="span#username-error-message-template" 
                required="required" 
                aria-invalid="false"
        >            
        <span style="color: red;" id="username-error-message-template"></span>
                                
        <label for="date">Date:</label>
        <input 
                type="text" 
                id="date" 
                name="user[date]" 
                value="" 
                data-validator="dateGerman|notEmpty" 
                data-filter="trim" 
                data-error-class="error-foo-bar" 
                data-error-message--dategerman="Date is not correct." 
                data-error-message--notempty="Date is empty." 
                data-error-template-selector="span#date-error-message-template"
                required="required" 
                aria-invalid="true"
        >            
        <span style="color: red;" id="date-error-message-template">Date is not correct. Date is empty.</span>
                                
        <button type="submit">submit</button>
    </form>
    ',
    $formValidatorResult->getHtml()
);

验证器

您可以使用此处的所有验证器。

例如: data-validator="date"data-validator="' . \Respect\Validation\Rules\Date::class . '"(您需要将类的第一个字母小写,或者可以使用类名本身)

您可以通过 "|" 简单地组合验证器 ...

例如: data-validator="notEmpty|maxLength(100)"

PS:您可以使用逗号分隔的参数,或者使用serialize -> 像这样 -> in(' . serialize($selectableValues) . ')

如果您想使用HTML5验证,例如对于最小值或最大值,或者对于电子邮件等,可以使用"auto"。

例如: data-validator="auto"

默认情况下,我们将提交的值限制为表单中的值,例如对于复选框、单选按钮或选择框。如果您需要禁用此功能,可以使用"non-strict"。(不推荐)

例如: data-validator="non-strict"

默认情况下,我们使用验证异常类中的错误消息,但您可以通过以下方式使用自己的错误消息:"data-error-message--RULE_NAME_HERE"在HTML中。

例如: data-error-message--email="Email [%s] is not correct"

默认情况下,我们不将错误消息添加到HTML输出中,但您可以使用CSS选择器添加错误消息

例如: data-error-template-selector="span#email-error-message-template"

默认情况下,我们也不添加错误类,但您可以通过以下方式添加新的错误类

例如: data-error-class="error-foo-bar"

如果您需要更复杂的验证,则可以添加简单的自定义验证。

$formValidator->addCustomRule(
    'foobar',
    \Respect\Validation\Validator::allOf(
        \Respect\Validation\Validator::intVal(),
        \Respect\Validation\Validator::positive()
    )
);

例如: data-validator="foobar"

如果您需要真正的复杂验证,则可以创建自己的类。

<?php

namespace Respect\Validation\Rules;

class CustomRule extends AbstractRule
{
  /**
   * @param string $value
   *
   * @return bool
   */
  public function validate($value)
  {
    return ($value === 'foobar');
  }

}
<?php

namespace Respect\Validation\Exceptions;

class CustomRuleException extends ValidationException
{
  public static $defaultTemplates = [
      self::MODE_DEFAULT  => [
          self::STANDARD => 'Invalid input... \'foobar\' is only allowed here... ',
      ],
      self::MODE_NEGATIVE => [
          self::STANDARD => 'Invalid input... \'foobar\' is not allowed here... ',
      ],
  ];
}
$formValidator->addCustomRule('foobar', \Respect\Validation\Rules\CustomRule::class);

例如: data-validator="foobar"

过滤器

您还可以使用一些简单的过滤器,这些过滤器将应用于输入数据。

  • trim
  • escape(ENT_QUOTES | ENT_HTML5的htmlentities)
  • ... 以及此处的所有方法

例如: data-filter="strip_tags(<p>)"

PS:第一个参数将是用户提交的值

同样,您也可以通过 "|" 简单地组合一些过滤器 ...

例如: data-filter="strip_tags|trim|escape"

... 并且您还可以添加自定义过滤器。

$formValidator->addCustomFilter(
    'append_lall',
    function ($input) {
      return $input . 'lall';
    }
);

例如: data-filter="append_lall"

单元测试

  1. 运行测试前需要先安装Composer
composer install voku/HtmlFormValidator
  1. 您可以从根目录运行以下命令来执行测试:
./vendor/bin/phpunit

支持

如需支持或捐赠,请访问以下链接:Github | 问题 | PayPal | Patreon

如需查看状态更新和发布公告,请访问以下链接:发布 | Twitter | Patreon

如需专业支持,请联系

感谢

  • 感谢GitHub(微软)提供代码托管和良好的基础设施,包括问题管理等。
  • 感谢IntelliJ,他们提供了最好的PHP IDE,并授予我PhpStorm开源许可证!
  • 感谢Travis CI,它是最好的、最易用的持续集成工具!
  • 感谢StyleCI提供的简单但强大的代码风格检查。
  • 感谢PHPStanPsalm,它们是真正出色的静态分析工具,并在代码中发现了错误!