仅删除标签中的双精度空格

时间:2018-07-28 09:22:22

标签: php regex string

我想删除标签之间不必要的空格,而不是所有双精度空格,例如,我有以下字符串:

"<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);

1 个答案:

答案 0 :(得分:2)

我认为,应该将任务分为许多替换:

  1. 删除结束标记中的空格(在</之后和>之前。
  2. 删除开始标记中>之前的空格。
  3. 将多个空格(在标签中间)更改为一个空格。

因此示例 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,}),
  • 但是由于当前字符是>,因此失败。

因此,它从寻找下一个<开始的下一次尝试- 下一个标签。