我有一個字串。里面有“pre”標簽。我不想替換這個 pre 標簽中的文本。我怎樣才能做到這一點?
<?php
$str="
<b>test</b>
<pre>
<b>test</b>
</pre>
<b>test</b>
";
function htmltobb($str){
$str=preg_replace('(<b>)','[b]',$str);
$str=preg_replace('(</b>)','[/b]',$str);
return $str;
}
echo htmltobb($str);
?>
結果:
[b]test[/b]
<pre>
[b]test[/b]
</pre>
[b]test[/b]
我想要的是?
[b]test[/b]
<pre>
<b>test</b> <-- this line not replaced
</pre>
[b]test[/b]
謝謝你的所有答案
uj5u.com熱心網友回復:
一種凌亂的方法可能是在pre標簽之間獲取所有內容,對它進行 HTML 編碼,決議所有其他內容,然后將物體解碼回字符......這假設需要正則運算式并且您已經閱讀了它們的陷阱。
$str="
<b>test</b>
<pre>
<b>test</b>
</pre>
<b>test</b>
";
echo preg_replace_callback(htmlspecialchars('~(?s)<pre>.*?</pre>~'), function($match) { return htmlspecialchars_decode($match[0]);}, preg_replace('~<(/?)b>~','[$1b]', preg_replace_callback('~(?s)<pre>.*?</pre>~', function($match) { return htmlspecialchars($match[0]);}, $str)));
https://3v4l.org/UZbc2
從...開始:
<b>test</b>
<pre>
<b>test</b>
</pre>
<b>test</b>
第一次運行轉換為:
<b>test</b>
<pre>
<b>test</b>
</pre>
<b>test</b>
第二個轉換為:
[b]test[/b]
<pre>
<b>test</b>
</pre>
[b]test[/b]
第三把它按預期放回去:
[b]test[/b]
<pre>
<b>test</b>
</pre>
[b]test[/b]
uj5u.com熱心網友回復:
你需要切斷你的弦,在不在 pre 內部時進行替換,而不是在 pre 內部時進行替換。
$str="
<b>test</b>
<pre>
<b>test</b>
</pre>
<b>test</b>
";
echo htmltobb($str);
function htmltobb($str){
$aux = '';
$posB = 0;
while (($posA = mb_strpos($str, '<pre>', $posB)) !== false) {
$aux .= preg_replace(['(<b>)', '(</b>)'], ['[b]', '[/b]'], mb_substr($str, 0, $posA));
$posB = mb_strpos($str, '</pre>', $posA);
$aux .= mb_substr($str, $posA, $posB - $posA);
}
$aux .= preg_replace(['(<b>)', '(</b>)'], ['[b]', '[/b]'], mb_substr($str, $posB));
return $aux;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/349363.html
標籤:php
上一篇:提交表單后,Web顯示空白頁
