0

可能重复:
PHP,preg_replace,用标签 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);

输出

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

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

4

2 回答 2

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);

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

于 2013-01-22T11:45:50.970 回答
2

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

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

编辑

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

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

这里的模式可以理解为:

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

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

于 2013-01-22T11:45:29.523 回答