在preg_replace中使用£作为分隔符是否可以?

时间:2011-03-05 23:31:10

标签: php regex preg-replace special-characters eregi

我正在将我发现的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;
}

5 个答案:

答案 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值没有区别。

虽然我不得不问:传统然后逃避它有什么问题?或者使用具有字符范围的类?