我有这个HTML:
(text)Text one(/text)(text)text two(/text)<input type="text" name="name"
id="name" value="(text)text three(/text)" />(text)Text four(/text)
我想替换(text)和(/ text)之间包含的单词和相对(text)(/ text)标签,但输入/ textarea值中包含的标签除外。
我想使用正则表达式,而不是dom
实际上我正在使用:
preg_replace("~\\(text\)[\s\S]+?\\(\/text\)~","replacing text",$content);
但是这个替换所有内容,也包含输入内容/ textareas
由于
答案 0 :(得分:0)
您可以实施(*SKIP)(*FAIL)
技术以匹配<input...>
标记,并取消其替换资格。这将允许所有(text)...(/text)
子字符串按预期替换。
代码:(Demo)
$html=<<<HTML
(text)Text one(/text)(text)text two(/text)<input type="text" name="name"
id="name" value="(text)text three(/text)" />(text)Text four(/text)
HTML;
echo preg_replace('~<input[^>]+>(*SKIP)(*FAIL)|\(text\).*?\(/text\)~','[*]',$html);
输出:
[*][*]<input type="text" name="name"
id="name" value="(text)text three(/text)" />[*]
...现在为精美印刷:
preg_replace_callback()
可能是此工作的最佳工具。.*?
和(text)
之间使用(/text)
以允许(
字符的可能性。如果您知道,这些相对位置中不会有(
,您可以使用[^(]*
来提高模式效率。输入标记部分中的[^>]+
也是如此 - 如果您的项目数据在这些标记中包含>
,那么您可以使用.*?
,但效率会降低。