我的问题是如何在这个例子中替换一个字符串src
中的标签的值<script>
(好吧,我在标签内属性的更一般场景中需要这个):
$data = <<<EOD
<script language="javascript" src= "../tests/ajax-navigation.js"></script>
...
<img src="../404.jpg" alt="404">
...
EOD;
我在 php 中使用了这个函数:
class Search{
public static function replaceProperty($data, $start, $end, $property, $alias, $limit = -1){
//get blocks formed as: $start $property = "..." $end or $start $property = '...' $end
$pattern = "!(".$start."){1}(.*?)".$property."\s*=\s*[\"\'](.*?)[\"\'](.*?)(".$end."){1}!s";
$data = \preg_replace($pattern, "{$start}\${2}{$property}=\"{$alias}\"\${4}{$end}", $data, $limit);
return $data;
}
}
我这样称呼:
$data = Search::replaceProperty($data, "<script", ">", "src", $alias);
真正奇怪的是,这两个标签都<script>
被<img>
改变了!当然我可以这样称呼它
$data = Search::replaceProperty($data, "<script", "</script>", "src", $alias);
但这并不能回答一般情况!
只是为了用正则表达式澄清一些观点:
一世。要搜索的实际字符串是:
$data = <<<EOD
<script language="javascript" src= "../tests/ajax-navigation.js"></script>
...
<script language="javascript" type="text/javascript">
...
<img src="../404.jpg" alt="404">
...
EOD;
ii. 正则表达式$pattern = "!(".$start."){1}(.*?)".$property."\s*=\s*[\"\'](.*?)[\"\'](.*?)(".$end."){1}!s";
或最简单的形式$pattern = "%".$start."(.*?)".$property."\s*=\s*[\"\'](.*?)[\"\'](.*?)".$end."%s";
(只有 3 个子模式)按预期识别第一个<script>
,但是......它采用第二个并在第一个改变它之间找到的任何属性时<script>
终止!>
<img>
src
iii. 通过删除s
模式末尾的元字符,导致$pattern = "%".$start."(.*?)".$property."\s*=\s*[\"\'](.*?)[\"\'](.*?)".$end."%";
行为符合预期,但在标签被输入时失败:
<script language="javascript" src= "../tests/ajax-navigation.js"
></script>
iv. 而且,当然我的意图是替换而不是删除src
财产的价值。
希望这些能澄清我的问题。