php preg_replace返回未知修饰符'+'?

时间:2011-06-17 10:46:56

标签: php regex

尝试修复此正则表达式。它应该在字符串中找到任何超链接并在它们周围放置锚标记。继续回来,未知的标识符'+'。我认为加唱是正则表达式的一部分吗?

<?php

//replace links with clickable links

// match protocol://address/path/
$comments = preg_replace("[a-zA-Z]+://([.]?[a-zA-Z0-9_/-])*", "<a href=\"\\0\">\\0</a>", $comments);

// match www.something
$comments = preg_replace("(^| )(www([.]?[a-zA-Z0-9_/-])*)", "\\1<a href=\"http://\\2\">\\2</a>", $comments);

?>

任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:7)

PCRE模式(您提供给preg_replace的模式)需要被delimiters括起来:

~[a-zA-Z]+://([.]?[a-zA-Z0-9_/-])*~

此处~是分隔符。我使用了这个char,因为它不会出现在正则表达式的其余部分中。

解释错误:PCRE认为[是分隔符(因为第一个char总是分隔符)。因此,当它发现相应的结束分隔符]时,它会考虑修饰符之后的所有内容。由于没有+修饰符,您会收到错误;)

答案 1 :(得分:-1)

尝试替换

"[a-zA-Z]+://([.]?[a-zA-Z0-9_/-])*", "<a href=\"\\0\">\\0</a>"

r'[a-zA-Z]+://([.]?[a-zA-Z0-9_/-])*', '<a href=\"\\0\">\\0</a>'