【问题标题】:Regex: remove whitespaces but not from < > tag正则表达式:删除空格,但不从 < > 标签中删除
【发布时间】:2012-05-10 17:43:32
【问题描述】:

多年来,我一直在为正则表达式苦苦挣扎。我需要的是从字符串中删除所有空格,而不是从 中删除(例如,a href 标记或 img src 标记必须有空格)。

我在 PHP 中做这件事,我正在尝试不同的解决方案(我完全是一个正则表达式的菜鸟,这让我很困惑)。 到目前为止,这是我的代码的一部分:

$text=$_POST["text"];
$pattern = '(\<.+?\>)|\s'; 
$replace = '';
echo preg_replace( $pattern, $replace, $text );

这有什么问题? :(

【问题讨论】:

  • 你能发布一个示例 $_POST 值吗?
  • 是的,像“foo fo o o o oo ”输出应该是“foofoooooo ”
  • 它有什么作用。还有一些在线正则表达式工具可能会帮助您解决这个问题

标签: php regex string preg-replace


【解决方案1】:

首先,您忘记了正则表达式周围的分隔符。然后,正则表达式 /(\&lt;.+?\&gt;)|\s/ 匹配标签或空格,因此您的 preg_replace()either one 替换为空字符串。

至少可以说,用正则表达式操作 HTML 是很困难的。如果您可以确定您的文件中除了它们分隔标记的位置之外的任何位置都没有任何&lt;s 和&gt;s,您可以查找最接近的括号(如果有)是开头的空格:

$result = preg_replace(
    '/\s+     # Match one or more whitespace characters
    (?!       # but only if it is impossible to match...
     [^<>]*   # any characters except angle brackets
     >        # followed by a closing bracket.
    )         # End of lookahead
    /x', 
    '', $subject);

【讨论】:

  • 这是一个好点,也许使用 /(\)|\s/ 之类的东西会更好,因为我需要保留 img 标签中的空格
  • 这个正则表达式会根据需要保留“”之间的所有空格。它还将像"&lt;p class="myclass"&gt;test my string&lt;/p&gt;if this &gt; that" 这样的字符串输出为"&lt;p class="myclass"&gt;testmystring&lt;/p&gt;if this &gt;that"。如果您的字符串中没有任何“”,则可以使用它。
  • 我仍然无法将 (?! 放在正确的位置 :) 赞成。
  • 谢谢,两种解决方案都有效(我必须进行编辑以使其仅适用于 :))
  • @Simone:你不会有太多的运气。这需要变长的lookbehind 断言,而PHP 不支持这些。此处的这个正则表达式依赖于lookahead 断言,当您在标签中向前看时,您显然看不到标签开头的内容(在本例中为标签的名称)。跨度>
【解决方案2】:

非正则表达式解决方案。

function remove_non_tag_space($text){
    $len = strlen($text);
    $out = "";
    $in_tag=false;
    for($i=0;$i<$len; $i++){
        $c = $text[$i];
        if($c=='<')
            $in_tag=true;
        elseif($c=='>')
            $in_tag=false;

        $out .= $c==" "? ($in_tag? $c: ""): $c;
    }
    return $out;
}

在此处查看示例http://ideone.com/oI0DI

【讨论】:

  • 谢谢,这两种解决方案都有效(我必须进行编辑以使其仅适用于 :)
  • 非正则表达式解决方案通常比正则表达式更快。
  • @Simone:更快/更慢在这里可能无关紧要(而且我不确定正则表达式是否更慢)。重要的是正则表达式不是正确的工具。我确信 shiplu.mokadd.im 可以帮助您改进此代码以仅处理图像标签。那你应该接受他的回答。
猜你喜欢
  • 1970-01-01
  • 2018-06-11
  • 2018-08-13
  • 2011-11-01
  • 2012-11-15
  • 2020-10-27
  • 2017-08-16
  • 1970-01-01
  • 2017-03-06
相关资源
最近更新 更多