Regex 正则表达式-忽略匹配中字符串的某些部分

Regex 正则表达式-忽略匹配中字符串的某些部分,regex,preg-match-all,Regex,Preg Match All,这是我的字符串: address='St Marks Church',notes='The North East\'s premier...' 使用match\u all获取各个部分的正则表达式是 '/(address|notes)='(.+?)'/i' 结果是: 地址=>圣马克教堂注释=>东北\ 如何使其忽略注释的\'字符?您应该匹配前面没有反斜杠的结束引号,因此: (address|notes)='(.*?)[^\\]' 此[^\\]强制“字符”前面的字符不能是反斜杠 不确定是否用he

这是我的字符串:

address='St Marks Church',notes='The North East\'s premier...'
使用
match\u all
获取各个部分的正则表达式是

'/(address|notes)='(.+?)'/i'
结果是:

地址=>圣马克教堂
注释=>东北\


如何使其忽略注释的\'字符?

您应该匹配前面没有反斜杠的结束引号,因此:

(address|notes)='(.*?)[^\\]'

[^\\]
强制“字符”前面的字符不能是反斜杠

不确定是否用herdoc或双引号包装字符串,但采用一种不太贪婪的方法:

$str4 = 'address="St Marks Church",notes="The North East\'s premier..."';
preg_match_all('~(address|notes)="([^"]*)"~i',$str4,$matches);
print_r($matches);
输出

Array
(
    [0] => Array
        (
            [0] => address="St Marks Church"
            [1] => notes="The North East's premier..."
        )

    [1] => Array
        (
            [0] => address
            [1] => notes
        )

    [2] => Array
        (
            [0] => St Marks Church
            [1] => The North East's premier...
        )

)
使用preg_split的另一种方法:

//split the string at the comma
//assumes no commas in text
$parts = preg_split('!,!', $string);
foreach($parts as $key=>$value){
    //split the values at the = sign
    $parts[$key]=preg_split('!=!',$value);
    foreach($parts[$key] as $k2=>$v2){
        //trim the quotes out and remove the slashes
        $parts[$key][$k2]=stripslashes(trim($v2,"'"));
    }
}
输出如下所示:

Array
(
    [0] => Array
        (
            [0] => address
            [1] => St Marks Church
        )

    [1] => Array
        (
            [0] => notes
            [1] => The North East's premier...
        )

)
超慢速旧skool方法:

$len = strlen($string);
$key = "";
$value = "";
$store = array();
$pos = 0;
$mode = 'key';
while($pos < $len){
  switch($string[$pos]){
    case $string[$pos]==='=':
        $mode = 'value';
        break;
    case $string[$pos]===",":
        $store[$key]=trim($value,"'");
        $key=$value='';
        $mode = 'key';
        break;
    default:
        $$mode .= $string[$pos];
  }

  $pos++;
}
        $store[$key]=trim($value,"'");
$len=strlen($string);
$key=“”;
$value=“”;
$store=array();
$pos=0;
$mode='key';
而($pos<$len){
开关($string[$pos]){
案例$string[$pos]=='=':
$mode='value';
打破
案例$string[$pos]==“,”:
$store[$key]=trim($value,“”);
$key=$value='';
$mode='key';
打破
违约:
$$mode.=$string[$pos];
}
$pos++;
}
$store[$key]=trim($value,“”);

因为您已经发布了您正在使用
match\u all
,并且您的配置文件中的顶部标记是
php
wordpress
,我认为假设您正在使用
preg\u match\u all()
与php配合使用是公平的

以下模式将匹配构建所需关联数组所需的子字符串:

生成完整字符串匹配和1个捕获组的模式:

  • /(地址|注释)='\K(?:\\\'.[^'])*/
    (166步,)
  • /(地址|注释)='\K.*(?=)?
    一些注意事项:

    • 使用捕获组、备选方案和环顾会降低模式效率。限制这些组件的使用将提高性能。使用否定字符类通常会提高性能

    • 在尝试减少捕获组时,使用
      \K
      (重新启动完整字符串匹配)非常有用,它可以减少输出数组的大小


    你想只考虑表达式中的字母数字字符吗?基本上没有“和第二个‘排除’之间的任何东西。我是一个正则表达式新手。恐怕很可能也得到第一个比特错误。如果输入是:<代码>”地址=“。
    ?正如@anubhava所提到的,这个答案是不正确的,并且会破坏预期的回报值。(被否决为误导)@Paul Phillips 4年后,你可能不再是regex的新手。请查看本页上的所有答案。遗憾的是,本页上的其他答案不准确/不正确,并且随着时间的推移收集了选票(这意味着他们多年来一直在误导读者)。如果您对我的答案或其他答案不正确的原因有任何疑问,我将很乐意解释。嘿,Mick,您是在浏览每个人过去的答案还是我的答案?我是在另一个StackExchange网站上搜索另一个问题时偶然发现此页面的。我的行为没有任何欺诈行为。如果我想成为一个欺诈者,我将不,我所做的是确定一个页面包含3个不正确的答案(现在是在anubhava删除了他的答案后的2个),合理地否决了错误信息的错误答案,留下了解释性评论(带有演示链接)编辑了这个问题,并提供了全面和周到的答案。我所做的应该只考虑“内容改进”。我猜它过去工作(虽然我不知道如何)。否则,人们只是瞥了一眼,认为它有效,尽管它被标记为答案,所以它可能帮助OP解决了他们的问题。不管怎样。它从来没有像预期的那样有效。OP盲目地相信答案。随着盲人信任盲人多年,雪球越来越大。您的第一个方法调整输入字符串以适应该方法,这就是我第二个使用
    preg\u split()
    where
    explode()
    是一个合理的函数调用。此外,如果字符串中可能有
    \'
    ,那么可以公平地假设
    =
    也是可能的。第三个,我还没有测试,但它要么有一个打字错误,要么使用变量,应该尽可能避免。我删除了我的否决票,因为我感谢您尝试修复您的答案。遗憾的是,我觉得我必须重新投票,因为这个答案暗示了糟糕和/或不可靠的方法。对糟糕的数据存储方法做出让步是绝对不可取的。这个文本流应该存储在JSON、XML甚至CSV中,并理想地使用行业标准方法进行处理。感谢您不过我的意见是错误的。
    $string="address='St Marks Church',notes='The North East\'s premier...'";
    
    if(preg_match_all("/(address|notes)='\K(?:\\\'|[^'])*/",$string,$out)){
        $result=array_combine($out[1],$out[0]);
    }
    var_dump($result);
    
    echo "\n---\n";
    
    if(preg_match_all("/(address|notes)='((?:\\\'|[^'])*)/",$string,$out,PREG_SET_ORDER)){
        $result=array_combine(array_column($out,1),array_column($out,2));
    }
    var_dump($result);
    
    array(2) {
      ["address"]=>
      string(15) "St Marks Church"
      ["notes"]=>
      string(28) "The North East\'s premier..."
    }
    
    ---
    array(2) {
      ["address"]=>
      string(15) "St Marks Church"
      ["notes"]=>
      string(28) "The North East\'s premier..."
    }