【问题标题】:PHP, Please help to improve Regular Expression [duplicate]PHP,请帮助改进正则表达式[重复]
【发布时间】:2013-01-05 15:09:15
【问题描述】:

可能重复:
PHP, preg_replace, replace tag with tag attr

我阅读了很多参考资料,但这很难理解。

请帮助改进我的代码。

我想换

<script src="core.js"></script> to <temp src="core.js"></temp>

当我测试它时,下面将实际输出我想要的。但是,在$replace上,我只放了&lt;temp,怎么会替换结束标签???

$string = '<script src="core.js"></script>';
$pattern = '/^<script|<\/script>$/i';
  //    ^(start from script)    | (or)    $(end with script)
$replace = '<temp';
echo preg_replace($pattern, $replace, $string);

输出

<temp src="core.js"></temp>

非常感谢您的帮助和建议。

【问题讨论】:

  • 这有什么意义?您正在使您的有效代码无效。看起来更像是结构/设计问题,而不是现实世界的问题。
  • 我不太懂正则表达式...请告诉我哪部分不正确?

标签: php string replace preg-replace preg-match


【解决方案1】:

很抱歉,由于您询问了正则表达式,因此无法回答您的问题,但如果您可以使用 str_replace,通常这样做会更好,而且速度更快。

$result = str_replace('<script', '<temp', $string);
$result = str_replace('script>', 'temp>', $result);

这个问题是,它不会匹配像这样的字符串:

<script src="core.js"></script >

我不这样做的原因:

str_replace("script", "temp", $string);

是因为您的变量中可能包含“脚本”一词的其他含义,例如,如果一个 js 文件被称为 example.script.js

【讨论】:

  • 我是菜鸟,请问这种情况,一般人不会用正则表达式吗?
  • 正确;正如 Jleagle 所说,使用 str_replace 进行简单替换要快得多。 PHP manual for str_replace 声明“如果您不需要花哨的替换规则(如正则表达式),则应始终使用此函数而不是 preg_replace()。”
【解决方案2】:

您需要使用正则表达式吗?不能只用str_replace吗?

$string = '<script src="core.js"></script>';
echo str_replace("script", "temp", $string);

编辑

如果你觉得你真的必须使用正则表达式,那么你遇到的问题是结束标签 &lt;/script&gt; 被替换为 &lt;temp。尝试使用捕获括号:

$string = '<script src="core.js"></script>';
$pattern = '/(<\/?)script([^>]*>)$/i';
$replace = '$1temp$2';
echo preg_replace($pattern, $replace, $string);

这里的模式可以读作:

  • (&lt;\/?)&lt; 可选地后跟 /
  • script:文字字符串script
  • ([^&gt;]*&gt;):任何不是&gt;的字符0次或多次,后跟&gt;

在替换字符串中,$1 表示匹配第一个带括号的模式,$2 表示第二个。

【讨论】:

  • 在实际实现时,$string 不仅仅是那个 html。我需要查找和替换..如果是这样,可能会有与“脚本”相同的词......我该如何避免这个问题?
猜你喜欢
  • 2018-05-05
  • 2011-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-09
  • 1970-01-01
相关资源
最近更新 更多