正则表达式与引号中的内容不匹配

时间:2013-07-29 15:46:34

标签: regex preg-match regex-negation

我在php preg_match中使用了一些正则表达式来删除“:”和“(”

中的尾随空格
([\(:])\s+

我遇到的问题是它最终剥离了我需要的引号内的空格。例如,这个字符串:

img[style*="float: left"]

有没有办法编写正则表达式,所以它匹配任何“:”或“(”除非用双引号括起来?

3 个答案:

答案 0 :(得分:1)

有两种方法可以解决这个问题:

  1. 您可以使用负面外观(信息here)来尝试断言在您不想剥离的内容之前或之后没有双引号。我遇到的问题是,没有任何迹象表明引号:(可能有多远,并且外观的长度不可知。

  2. 我喜欢做的是“保留”双引号内的任何内容,在数组中使用正则表达式\"[^"]+\",并用字符串替换它们(我使用“THIS_IS_A_QUOTE”)。在数组中存储所有引号后,删除所有空格,最后使用数组中的字符串恢复所有“THIS_IS_A_QUOTE”字符串。

答案 1 :(得分:1)

你可以试试这个:

$text = preg_replace('~(?|(\\\{2}|\\\"|"(?>[^"\\\]+|\\\{2}|\\\")*+")|([:(])\s+)~', '$1', $text);

我们的想法是在([:(])\s+之前匹配双引号部分并自行替换它们。

为了避免匹配转义引号,之前匹配反斜杠。

模式细节:

~                                    # pattern delimiter
(?|                                  # branch reset : all capture groups inside have the same number
    (                                # open a capturing group
        \\\{2}                       # group of 2 backslashes (can't escape everything)
      |                              # OR
        \\\"                         # an escaped double quote
      |                              # OR
        "(?>[^"\\\]+|\\\{2}|\\\")*+" # content inside double quotes
    )                                # close the capturing group
  |                                  # OR
    ( [:(] )                         # a : or a ( in a capturing group
    \s+                              # spaces
)                                    # close the branch reset group
~                                    # pattern delimiter

兴趣是处理这种情况:

img: " : \" ( "
img: \" : ( " ( "
img: \\" : ( " ( "

结果:

img:" : \" ( "
img:\" :(" ( "
img:\\" : ( " ("

答案 2 :(得分:1)

描述

此例程将:

  • 跳过引号内找到的匹配
  • 替换在引号外找到的匹配

Live Demo

<强>代码

<?php

$string = 'img[style*="float: left"]
img: [style*="float: left"]
img( [style*="float: left"]
';


    $regex = '/"[^"]*"|([:(])\s+/ims';

    $output = preg_replace_callback(
        $regex,
        function ($matches) {
            if (array_key_exists (1, $matches)) {
                return $matches[1] ;
            }
            return $matches[0];
        },
        $string
    );
    echo "this is the output:"  . $output;

<强>输出

this is the output:img[style*="float: left"]
img:[style*="float: left"]
img([style*="float: left"]