PHP,请帮助改进正则表达式

时间:2013-01-22 11:38:21

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

  

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

我阅读了很多参考文献,但这很难理解。

请帮助改进我的代码。

我想替换

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

在我测试时,下面将实际输出我想要的内容。但是,在$ replace上,我只放了<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);

Out Put

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

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

2 个答案:

答案 0 :(得分:2)

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

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

修改

如果您觉得必须使用正则表达式,那么您遇到的问题是结束标记</script>正在被<temp替换。尝试使用捕获括号:

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

此处的模式可以理解为:

  • (<\/?)<可选地后跟/
  • script:文字字符串script
  • ([^>]*>):任何字符不是> 0次或更多次,后跟>

在替换字符串中,$1表示与第一个括号模式匹配的任何内容,第二个是2美元。

答案 1 :(得分:2)

很抱歉,如果这不能回答您的问题,因为您询问了正则表达式,但是如果您可以使用str_replace,那么通常情况下这样做会更好,而且速度要快得多。

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

这个问题是,它不匹配字符串:

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

我不仅仅这样做的原因:

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

是因为您可以在变量中包含“script”一词的其他内容,例如,如果js文件名为example.script.js