检查正则表达式是否正确

时间:2013-12-16 22:56:47

标签: php regex hyperlink preg-replace preg-match

我刚刚制作了一个正则表达式模式来替换HTML锚标签的链接,就是这样:

~((http\:\/\/|https\:\/\/)([^ ]+)) ~

我之所以这样问,是因为我刚刚完成了这个正则表达式,并用一些链接做了一些测试,它运行得很好,但我想确定这个模式没有错误(我是一个正则表达式并且也许正则表达专家可以告诉他的意见和/或建议。

顺便说一句,如果你在最后找出空间,你可能会认为如果字符串没有以空格结尾它将不起作用,但我的诀窍是在字符串之前将该空格添加到字符串中更换,然后在完成后再将其移除。

PD:

我没有处理链接的验证本身,我只是想搜索以http://开头并以空格结尾的字符串,没有别的,因为链接验证有点复杂。

编辑:

我的一些代码:

<?php

    $patron = "~(https?:\/\/[^\s]+) ~";
    //$patron = "~((http\:\/\/|https\:\/\/)([^ ]+)) ~";
    $reemplazar = '<a href="$1">$1</a> ';
    $cadena = "https://www.youtube.com/watch?v=7it5wioGixA ";

    echo preg_replace($patron, $reemplazar, $cadena);

?>

2 个答案:

答案 0 :(得分:2)

我认为这可以大大简化:

~(https?://\S+) ~

除此之外:对我来说没问题。

答案 1 :(得分:1)

使用相同的想法,您的模式可以缩短为:

~https?://[^\s"'>]+~    # don't forget to escape the quote you use.

将网址更改为链接:

$html = preg_replace_callback('~\b(?:(https?://)|www\.)[^]\s"\')<]++~',
    function ($m) {
        $pre = ($m[1]) ? $m[1] : 'http://'; 
        if (filter_var($pre . $m[0], FILTER_VALIDATE_URL))
            return '<a href="' . $m[0] . '">' . $m[0] . '</a>';
        else return $m[0];
    }, $html);

旧答案:

更改链接中的网址:

从所有“a”标签中提取所有href属性的更好方法是使用DOM。

$doc = new DOMDocument();
@$doc->loadHTML($htmlString);
$links = $doc->getElementsByTagName('href');
foreach($links as &$link) {
    $href = $link->getAttribute('href');
    $link->setAttribute('href', 'what you want');
}