检查正则表达式模式是否正确


Check if regex pattern is correct

我刚刚制作了一个正则表达式模式来替换指向 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);
?>

我认为这可以大大简化:

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

除此之外:对我来说看起来还不错。

有了同样的想法,你的模式可以缩短为:

~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');
}