正则表达式上缺少奇怪的空白

时间:2011-05-15 22:20:05

标签: php regex

我在PHP上有这种正则表达式:

$str="first word https://www.helloz.it last word";
$str=preg_replace(
    '#[^"](((http|https|ftp)://)[^\s\n]+)#',
    '<a class="lforum" href="$1">$1</a>',
    $str);
echo nl2br($str);

我期望的输出是:

first word <a class="lforum" href="https://www.helloz.it">https://www.helloz.it</a> last word

但事实上输出是:

first word<a class="lforum" href="https://www.helloz.it">https://www.helloz.it</a> last word

(注意first word<a class...之间缺少的空白

它在哪里消失了空白? :)谢谢

2 个答案:

答案 0 :(得分:1)

[^"]匹配空格,您将替换删除空格的整个匹配项。将它放在()中,然后将其放回新字符串中。

答案 1 :(得分:1)

[^"]说“匹配不是"的字符”。空格字符与此匹配,因此它将被正则表达式替换。

使用负面的lookbehind:

'#(?<!")(((http|https|ftp)://)[^\s\n]+)#',

这表示“匹配字符串,如果它不遵循引号”。因此,前面的字符不会包含在匹配的内容中。

有关lookbehinds的信息,请参阅regular-expressions.info