【问题标题】:PHP: regex & hash key in stringPHP:字符串中的正则表达式和哈希键
【发布时间】:2010-09-21 16:11:43
【问题描述】:

如何处理正则表达式中的特殊字符? @ ? # $ % %...
此模式搜索介于前缀和后缀之间的字母。

$pattern = '/((?<!\b$PREFIX)$LETTER|$LETTER(?!$SUFFIX\b))/i';

$string = 'end'; 

$prefix = 'e';  
$letter = 'n';  
$suffix = 'd';  

但是如果$string# 开头呢

$string = '#end';
$prefix = ???

编辑:这是完整的 preg_replace

$text = "<p>Newton, Einsteing and Edison. #end</p>"
$pattern = '/((?<!\b$PREFIX)$LETTER|$LETTER(?!$SUFFIX\b))/i';
echo preg_replace($pattern, '<b>\1</b>', $text);

这会将所有n 字母替换为粗体n,但应该排除#end 中的n

【问题讨论】:

  • 啊,\b 不起作用才是问题所在。

标签: php regex preg-replace special-characters


【解决方案1】:

您必须用双引号将您的模式括起来以插入变量。

$pattern = "/((?<!\b$PREFIX)$LETTER|$LETTER(?!$SUFFIX\b))/i";

此外,您还可以定义 $prefix(小写)并使用 $PREFIX(大写)。所以脚本变成了以下内容,对我来说很好用:

<?php
$PREFIX = 'e';  
$LETTER = 'n';  
$SUFFIX = 'd';  
$text = "<p>Newton, Einsteing and Edison. #end</p>";
$pattern = "/((?<!\b$PREFIX)$LETTER|$LETTER(?!$SUFFIX\b))/i";
echo preg_replace($pattern, "<b>$1</b>", $text),"\n";
?>

输出:

<p><b>N</b>ewto<b>n</b>, Ei<b>n</b>stei<b>n</b>g a<b>n</b>d Ediso<b>n</b>. #end</p>

没有代码格式化:

Newton,Einsteing and Ediso n。 #结束

【讨论】:

    【解决方案2】:

    您必须先用反斜杠转义特殊字符。 但由于反斜杠已经转义了字符串中的字母,因此您必须先转义反斜杠。

    $string = '\\#end';
    

    一个更好的方法是在你的字符串上使用preg_quote() 函数,并指定你使用什么样的分隔符(这里是“/”)。

    preg_quote($string, '/');
    

    【讨论】:

      猜你喜欢
      • 2017-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-04
      • 2018-01-12
      相关资源
      最近更新 更多