嘿,所以我正在寻找一个正则表达式,它允许我基本上用任何东西(例如“xxx”)替换换行符,但前提是换行符不在 textarea 标签内。
例如,以下内容:
<strong>abcd
efg</strong>
<textarea>curious
george
</textarea>
<span>happy</span>
会变成:
<strong>abcdxxxefg</strong>xxx<textarea>curious
geroge
</textarea>xxx<span>happy</span>
有人知道我应该从哪里开始吗?我在这里有点无能为力:( 感谢您提供的任何帮助。
最佳答案
我知道了,但你不会喜欢的。 ;)
$result = preg_replace(
'~[\r\n]++(?=(?>[^<]++|<(?!/?textarea\b))*+(?!</textarea\b))~',
'XYZ', $source);
匹配换行符后,先行扫描,消耗任何不是左尖括号的字符,或任何不是 <textarea>
开头的左尖括号或 </textarea>
标签。当它用完这些标签时,它看到的下一件事必须是这些标签之一或字符串的结尾。如果是 </textarea>
标记,这意味着在 textarea 元素内发现换行符,因此匹配失败,并且不会替换该换行符。
我在下面包含了一个扩展版本,您可以 see it an action on ideone .如果你真的愿意,你也可以调整它来处理其他标签。但在我看来你需要的是一个 HTML 最小化器(或 minifier);有很多可用的。
$re=<<<EOT
~
[\r\n]++
(?=
(?>
[^<]++ # not left angle brackets, or
|
<(?!/?textarea\b) # bracket if not for TA tag (opening or closing)
)*+
(?!</textarea\b) # first TA tag found must be opening, not closing
)
~x
EOT;
关于php - 正则表达式:在不在文本区域中的字符串中查找换行符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4118783/