从代码中提取所有字符串值

时间:2013-10-07 16:50:11

标签: php regex

大家。我有一个问题,我无法解决它。

模式:\'(.*?)\'

源字符串:'abc', 'def', 'gh\'', 'ui'

我需要[abc][def][gh\'][ui]

但我得到[abc][def][gh\][, ]等。

有可能吗?提前致谢

4 个答案:

答案 0 :(得分:1)

是的,这些比赛是可能的。

但是如果你想询问是否有可能得到引号内的内容,最简单的方法是用逗号分割(最好通过CSV解析器)并修剪任何尾随空格。

否则,您可以尝试类似:

\'((?:\\\'|[^\'])+)\'

哪个匹配\'或非引用字符,但会对\\'等内容失败...

您可能在这种情况下使用的更长,更慢的正则表达式是:

\'((?:(?<!\\)(?:\\\\)*\\\'|[^\'])+)\'

在PHP中:

preg_match_all('/\'((?:(?<!\\)\\\'|[^\'])+)\'/', $text, $match);

或者如果您使用双引号:

preg_match_all("/'((?:(?<!\\\)\\\'|[^'])+)'/", $text, $match);

当它应该正常工作时,不确定为什么(?<!\\)(我的意思是一个字面反斜杠)出现错误。如果模式更改为(?<!\\\\),则可以使用。

ideone demo

编辑:找到一个更简单,更好,更快的正则表达式:

preg_match_all("/'((?:[^'\\]|\\.)+)'/", $text, $match);

答案 1 :(得分:1)

PHP代码:使用负面背后隐藏

$s = "'abc', 'def', 'ghf\\\\', 'jkl\'f'";
echo "$s\n";
if (preg_match_all("~'.*?(?<!(?:(?<!\\\\)\\\\))'~", $s, $arr))
   var_dump($arr[0]);

<强> OUTOUT:

array(4) {
  [0]=>
  string(5) "'abc'"
  [1]=>
  string(5) "'def'"
  [2]=>
  string(7) "'ghf\\'"
  [3]=>
  string(8) "'jkl\'f'"
}

现场演示:http://ideone.com/y80Gas

答案 2 :(得分:0)

<?php

    // string to extract data from 
    $string  = "'abc', 'def', 'gh\'', 'ui'";

    // make the string into an array with a comma as the delimiter 
    $strings = explode(",", $string);

    # OPTION 1: keep the '

        // or, if you want to keep that escaped single quote
        $replacee = ["'", " "];
        $strings  = str_replace($replacee, "", $strings);
        $strings  = str_replace("\\", "\'", $strings);


    # OPTION 2: remove the ' /// uncomment tripple slash

        // replace the single quotes, spaces, and the backslash 
        /// $replacee = ["'", "\\", " "];

        // do the replacement, the $replacee with an empty string
        /// $strings = str_replace($replacee, "", $strings);


    var_dump($strings);

?>

答案 3 :(得分:-1)

相反,您应该使用str_getcsv

str_getcsv("'abc', 'def', 'gh\'', 'ui'", ",", "'");