【问题标题】:using php preg_replace with regex使用带有正则表达式的 php preg_replace
【发布时间】:2012-07-15 23:14:37
【问题描述】:

我创建了一个 php 正则表达式来查找字符串中的所有 cmets /* */,当我使用此测试工具 http://regexpal.com/ 对其进行测试时,该字符串可以正常工作

/\*(.*\s){0,}.*\*\/

然后我用分隔符 # 包围它,所以它可以与 preg_replace 一起使用,但现在它不起作用。

#/\*(.*\s){0,}.*\*\/#

$fileContents = preg_replace("#/\*(.*\s){0,}.*\*\/#","Replacement Text",$fileContents);

当我回显 $fileContents 时,什么都没有打印出来。我做错了什么?

【问题讨论】:

  • 看起来像it works for me。你有失败的测试用例吗?
  • 为什么看起来这么复杂?您可以只使用 .*?#s dotall 修饰符来代替内部匹配。
  • 提示:{0,}* 相同。在将 $fileContents 输入 preg_replace 之前,您是否检查过它是否确实包含某些内容?即使正则表达式没有找到要替换的任何内容,您也应该至少取回原始字符串。
  • FileContents 包含之前的文本,我回显出来检查。当我将 var_dump 添加到 preg_replace 时,它​​输出 null。
  • 只是为了让你知道我想通了。 CRLF 线路终结器存在问题。我使用了正则表达式 "#/*(.\r?\n)*.**\/#" 请参阅链接 stackoverflow.com/questions/1179349/… 感谢您的所有帮助

标签: php regex preg-replace


【解决方案1】:
<?php 
  $fileContents = "Hello /* comment here */ World"; 
  $fileContents = preg_replace('#\/\*.*\*\/#m','',$fileContents); 
  echo $fileContents; // outputs Hello World

  $fileContents = <<<END
Hello
/*
 * Comment spanning several lines..
 *
 */
Earth
END;

  $fileContents = preg_replace('#\/\*.*\*\/#m','',$fileContents); 
  echo $fileContents; // outputs Hello Earth
?> 

正则表达式末尾的m 将匹配“多行”,因此当注释跨越多行时,它仍然可以匹配它们。默认匹配是单行。

请参阅 PCRE 以供参考:http://www.php.net/manual/en/reference.pcre.pattern.modifiers.php

【讨论】:

  • 这不是#m 所做的。它会影响 ^$ 匹配换行符而不是主题开始和结束的方式。
  • 当我使用你的例子时它可以工作,但是当我用我的替换文本时它没有?
猜你喜欢
  • 2011-05-20
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-11
  • 2015-12-01
  • 1970-01-01
  • 2011-04-11
相关资源
最近更新 更多