我在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...
之间缺少的空白
它在哪里消失了空白? :)谢谢
答案 0 :(得分:1)
[^"]
匹配空格,您将替换删除空格的整个匹配项。将它放在()
中,然后将其放回新字符串中。
答案 1 :(得分:1)
[^"]
说“匹配不是"
的字符”。空格字符与此匹配,因此它将被正则表达式替换。
使用负面的lookbehind:
'#(?<!")(((http|https|ftp)://)[^\s\n]+)#',
这表示“匹配字符串,如果它不遵循引号”。因此,前面的字符不会包含在匹配的内容中。
有关lookbehinds的信息,请参阅regular-expressions.info。