我想删除标签之间不必要的空格,而不是所有双精度空格,例如,我有以下字符串:
"<div class='anything' >Here will be a text or something.</ div >"
最终结果必须是这样的:
"<div class='anything' >Here will be a text or something.</ div >"
更好的结果将是这样:
"<div class='anything'>Here will be a text or something.</div>"
我想使用preg_replace我尝试使用此代码:
$html = preg_replace('/ ?> < ?/','><', $html);
答案 0 :(得分:2)
我认为,应该将任务分为许多替换:
</
之后和>
之前。>
之前的空格。因此示例 PHP 脚本,其中包含部分结果的打印输出, 如下所示:
<?php
$src = "xx <div class='anything' id='abc' >Here " .
"will be a text or something.</ div >";
echo "Source: " . $src . "\n";
// Delete spaces in a closing tag
$src = preg_replace('/<\/ *([a-z]+) *>/i', '</$1>', $src);
echo "Repl 1: " . $src . "\n";
// Delete spaces before ">"
$src = preg_replace('/(<[^>]+?) +>/i', '$1>', $src);
echo "Repl 2: " . $src . "\n";
// Change multiple spaces into a single space
$src = preg_replace('/(?:<|(?!\A)\G)[^>]+?\K {2,}/i', ' ', $src);
echo "Repl 3: " . $src . "\n";
?>
有关正则表达式3的一些解释:
(?:<|(?!\A)\G)
-从<
或最后一个点开始
比赛结束。[^>]+?
-匹配除>
以外的其他字符序列
尽可能。实际上,由于正则表达式的以下部分,
匹配的文本是多个空格之前的部分。\K
-忘记到目前为止所匹配的内容。{2,}
-匹配2个或更多空格的序列。由于\K
,唯一匹配的文本是一系列空格(在
标签),将其替换为一个空格。
在第二个替代方案中,(?!\A)
之前的\G
注意:\G
匹配
整个字符串的开头或最后一个匹配项的结尾,
但我们希望此处仅匹配最后一场比赛的结束。
因此,我在字符串的开头添加了(?!\A)
-负前瞻
禁用此变体。否则,此正则表达式将与例如的
在 xx 之后和第一个开始标记之前的多个空格的第一种情况。
另外一句话,对于源文本包含 多个 HTML元素-一个HTML片段(就像我在“我的”源代码中所做的一样) 文字):
当正则表达式处理器转到>
源字符时,终止当前
标签,
[^>]+?
的匹配,{2,}
),>
,因此失败。因此,它从寻找下一个<
开始的下一次尝试-
下一个标签。