Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP正则表达式不匹配字符串中的文本_Php_Regex - Fatal编程技术网

PHP正则表达式不匹配字符串中的文本

PHP正则表达式不匹配字符串中的文本,php,regex,Php,Regex,我有像foo=='bar test baz'和test.asd=“buz foo”这样的内容。我需要匹配“标识符”,左边不在双引号/单引号内的标识符。这就是我现在拥有的: preg_replace_callback('#([a-zA-Z\\.]+)#', function($matches) { var_dump($matches); }, $subject); 现在它甚至可以匹配字符串中的那些。我怎么写一个与字符串不匹配的呢 另一个例子:foo==5和bar!='buz'或fuz==

我有像
foo=='bar test baz'
test.asd=“buz foo”
这样的内容。我需要匹配“标识符”,左边不在双引号/单引号内的标识符。这就是我现在拥有的:

preg_replace_callback('#([a-zA-Z\\.]+)#', function($matches) {
    var_dump($matches);
}, $subject);
现在它甚至可以匹配字符串中的那些。我怎么写一个与字符串不匹配的呢

另一个例子:
foo==5和bar!='buz'或fuz=='foo bar fuz luz'
。所以本质上,匹配不在字符串内的a-zA-Z

/^[^'"=]*/
我会用你的例子。它匹配任意数量的字符(从字符串开头开始),这些字符既不是引号也不是等号

/^[^'"=\s]*/
此外,还避免了匹配空白,这可能是您所需要的,也可能不是您所需要的

编辑:

你问的是如何匹配文本中引用部分以外的字母(可能还有点?)。这更复杂。能够正确识别当前是否在引号字符串之外的正则表达式(通过确保引号的数量(不包括转义引号和嵌套引号)为偶数)与PHP正则表达式类似:

'/(?:
 (?=      # Assert even number of (relevant) single quotes, looking ahead:
  (?:
   (?:\\\\.|"(?:\\\\.|[^"\\\\])*"|[^\\\\\'"])*
   \'
   (?:\\\\.|"(?:\\\\.|[^"\'\\\\])*"|[^\\\\\'])*
   \'
  )*
  (?:\\\\.|"(?:\\\\.|[^"\\\\])*"|[^\\\\\'])*
  $
 )
 (?=      # Assert even number of (relevant) double quotes, looking ahead:
  (?:
   (?:\\\\.|\'(?:\\\\.|[^\'\\\\])*\'|[^\\\\\'"])*
   "
   (?:\\\\.|\'(?:\\\\.|[^\'"\\\\])*\'|[^\\\\"])*
   "
  )*
  (?:\\\\.|\'(?:\\\\.|[^\'\\\\])*\'|[^\\\\"])*
  $
 )
 ([A-Za-z.]+) # Match ASCII letters/dots
)+/x'

可以找到一个解释。但是,正则表达式可能不是用于此目的的合适工具。

您也可以尝试以下方法:

preg_match_all('/[\w.]+(?=(?:[^\'"]|[\'"][^\'"]*["\'])*$)/', $subject, $result, PREG_PATTERN_ORDER);
for ($i = 0; $i < count($result[0]); $i++) {
    # Matched text = $result[0][$i];
}
preg\u match\u all('/[\w.]+(?=(?:[^\'”]|[\'”][^\'”]*[“\'])*$)/',$subject,$result,preg\u PATTERN\u ORDER);
对于($i=0;$i

要匹配引号外的所有字母、数字和
以及点。您可以通过将允许的字符添加到
[\w.]

中来扩展它们。我在这里使用的技巧是,每当遇到引号时,强制正则表达式进行分支,然后稍后我们忽略此分支

$subject = <<<END
foo == 'bar test baz' and test.asd = "buz foo"
foo == 5 AND bar != 'buz' OR fuz == 'foo bar fuz luz'
END;

$regexp = '/(?:["\'][^"\']+["\']|([a-zA-Z\\.]+\b))/';

preg_replace_callback($regexp, function($matches) {;
    if( count($matches) >= 2 ) {
        print trim($matches[1]).' ';
    }
}, $subject);

// Output: 'foo and test.asd foo AND bar OR fuz '

为什么不分解(“=”,$subject)?@k102:没那么简单。我不能把每一个可能的变化都编出来,但这个主题在结构上可能会有很大的变化。例如:
foo='bar'和baz='foo'
。如果我太不精确,请原谅。我认为这与我在问题中补充的情况不完全相符?或者我不完全理解正则表达式,但从外观上看,它假设除了a-z和引号之外没有字符?我修改了答案,只匹配a-zA-z的大小写。询问您是否不清楚regexp。您有什么想法可以在问题中刚刚添加的示例中使用吗?@rFactor您编辑的问题不清楚。还请提供所需的输出。这有点困难,特别是因为引号可以转义或包含其他引号,如
“2\”乘4\”
“不”
等等。我正在进行preg\u replace\u回调,因为我需要替换那些匹配项。如果我只是做了一个匹配,我怎么知道我正在替换正确的内容(例如,
foo='foo'
应该匹配第一个
foo
,并用我的自定义内容替换它,但它不应该影响字符串中的内容)?@rFactor您可以将相同的正则表达式与preg\u replace\u回调一起使用。问题的关键是,对于你们编辑过的问题,我不清楚你们想要捕捉哪些角色。
(?: anything between quotes | any word consisting of a-zA-Z )