正则表达式:删除空格,但不删除< >标签

时间:2012-05-10 17:43:33

标签: php regex string preg-replace

我一直在努力学习regexp很多年......我需要的是从字符串中删除所有空格,但不是从<标签> (例如,一个href标签或一个img src标签必须有空格)。

我在PHP中这样做,我正在尝试不同的解决方案(我是regexp的总菜鸟,这让我很困惑)。 到目前为止,这是我的代码的一部分:

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

这有什么问题? :(

2 个答案:

答案 0 :(得分:6)

首先,你忘记了正则表达式周围的分隔符。然后,正则表达式/(\<.+?\>)|\s/匹配标记或空格,因此preg_replace()用空字符串替换任一个

至少可以说,使用正则表达式操纵HTML很困难。如果您可以确定文件中的任何位置都没有<>,除了它们分隔标记的位置,您可以查找最近的括号(如果有)的空格是一个开放的:

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

答案 1 :(得分: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