我正在将我发现的eregi_replace函数转换为preg_replace,但是eregi字符串中包含键盘上的每个字符。所以我尝试使用£作为分隔符..它目前正在工作,但我想知道它是否可能导致问题,因为它是一个非标准字符?
这是eregi:
function makeLinks($text) {
$text = eregi_replace('(((f|ht){1}tp://)[-a-zA-Z0-9@:%_\+.~#?&//=]+)',
'<a href="\\1">\\1</a>', $text);
$text = eregi_replace('([[:space:]()[{}])(www.[-a-zA-Z0-9@:%_\+.~#?&//=]+)',
'\\1<a href="http://\\2">\\2</a>', $text);
return $text;}
和preg:
function makeLinks($text) {
$text = preg_replace('£(((f|ht){1}tp://)[-a-zA-^Z0-9@:%_\+.~#?&//=]+)£i',
'<a href="\\1">\\1</a>', $text);
$text = preg_replace('£([[:space:]()[{}])(www.[-a-zA-Z0-9@:%_\+.~#?&//=]+)£i',
'\\1<a href="http://\\2">\\2</a>', $text);
return $text;
}
答案 0 :(得分:4)
您可以使用括号分隔正则表达式而不是单个字符,例如:
preg_replace('(abc/def#ghi)i', ...);
这可能比试图找到一个不是(还)你表达的一部分的晦涩角色更好。
答案 1 :(得分:4)
£
有问题,因为它不是ASCII字符。它来自Latin-1字符集,只有在PHP脚本也使用8位表示时才会起作用。如果您的文件编码为UTF-8,则£
将表示为两个字节。 PHP中的PCRE将超越它。 (至少我的版本确实如此。)
答案 2 :(得分:2)
您可以使用unicode字符,只是为了确定。
\u00A3
注意ereg功能和unicode支持。
http://www.regular-expressions.info/php.html
http://www.regular-expressions.info/characters.html
女王万岁。
答案 3 :(得分:2)
正如@Chris指出的那样,您可以使用成对的括号字符作为分隔符,但它们必须在整个正则表达式中正确平衡。例如,'<<>'
将不起作用,但'<<>>'
将起作用。您可以使用()
,[]
,{}
或<>
中的任何一种,但我建议使用大括号或方括号;括号在正则表达式中过于常见,并且尖括号用于转义序列,如(?>...)
(原子组)和(?<=...)
(lookbehind)。
但是我和@Brad一起讨论这个问题:为什么不在正则表达式出现时用反斜杠转义分隔符?
答案 4 :(得分:1)
您会比我们更了解正在解析的数据。就正则表达式而言,它与任何其他ASCII值没有区别。
虽然我不得不问:传统然后逃避它有什么问题?或者使用具有字符范围的类?