2

我使用 Zend\Validator\Hostname 来验证包含 url 的输入字符串。问题是它只接受 mydomain.com 类型的 URL,而不接受 http:// 或 https:// 协议前缀。实现所需行为的最佳方法是什么?

$inputFilter->add($factory->createInput(array(
                'name'     => 'shop_link',
                'required' => false,
                'filters'  => array(
                        array('name' => 'StripTags'),
                        array('name' => 'StringTrim'),
                ),
                'validators' => array(
                        array(
                            'name'    => 'StringLength',
                            'options' => array(
                                'encoding' => 'UTF-8',
                                'min'      => 1,
                                'max'      => 100,
                            ),
                        ),
                        array(
                            'name'    => 'Hostname',
                            'options' => array(
                                'allow'       => \Zend\Validator\Hostname::ALLOW_DNS, // Allow these hostnames
                                'useIdnCheck' => true,  // Check IDN domains
                                'useTldCheck' => true,  // Check TLD elements
                                'ipValidator' => null,  // IP validator to use
                            ),
                        ),
                ),
        )));

谢谢

4

4 回答 4

5

我没有 50 名声望来评论 Sam 的回答,但 Hostname::ALLOW_URI 不起作用。一年前没有工作 - https://stackoverflow.com/a/13902180/822947。如果您查看源代码,它不应该工作。奇怪的是它有两个赞成票。

$validator = new \Zend\Validator\Hostname();
$validator->setAllow($validator::ALLOW_DNS | $validator::ALLOW_URI);
var_dump($validator->isValid('http://domain.com')); // false!
于 2013-12-15T08:29:24.540 回答
4

您应该尝试两件事,第一件事可能已经是您想要的结果:

'options' => array(
    'allow' => Hostname::ALLOW_URI | Hostname::ALLOW_DNS,
    ....
)

允许 URI,至少按照 RFC 规范,应该包括方案的验证......

除此之外,还有一个您可能想知道的过滤器:Zend\Filter\UriNormalize

于 2013-08-19T05:44:54.990 回答
3

我使用了Uri验证器并禁用了 allowRelative(设置为 false)来验证 URI:

$this->add(array(
        'name' => 'url',
        'validators' => array(
            array(
                'name' => 'Uri',
                'options' => array(
                    'allowRelative' => false
                ),
            ),
        ),
    ));
于 2014-04-05T13:54:03.753 回答
0

尝试这个:

public function isValidUrl($url) {
    $uri = new \Zend\Validator\Uri();
    if (!$uri->isValid($url)) {
        return FALSE;
    }
    $parseUrl = parse_url($url);
    if(!isset($parseUrl['host']) || empty($parseUrl['host'])) {
        return FALSE;
    }
    $validator = new \Zend\Validator\Hostname(\Zend\Validator\Hostname::ALLOW_DNS);
    if (!$validator->isValid($parseUrl['host'])) {
        return FALSE;
    }
    if (!filter_var($parseUrl['host'], FILTER_VALIDATE_URL) === false) {
        return FALSE;
    }
    return TRUE;
}
于 2015-02-26T06:06:46.197 回答