2016-02-25 188 views
1

我有一个字符串,它是一个包含下面的代码片段一个PHP代码示例:替换字符串正则表达式

$data = array(
    'cKey1' => "dsfaasdfasdfasdfasdf", 
    'cKey2' => "asdfasdfasdfadsfasdf", 
    ... 
); 

目前我只是做了str_replace两个硬编码的钥匙,但我需要这现在变得更加灵活。这是两个正则表达式,我拿出这么远:

(?<=cKey1' =>).+(?=,) 
(?<=cKey2' =>).+(?=,) 

但是,由于一些人不使用空格,使用双引号,等等,这不是一个理想的解决方案。有人能以更好的方式指出我以更有效的方式取代cKey1cKey2的值吗?

谢谢!

+1

使用的分词器。 http://php.net/manual/en/function.token-get-all.php –

+0

@anubhava:输出将是相同的原始字符串,只是具有由值(类似于上面的例子中),而不是real cKeys –

回答

1

您可以使用\K(匹配复位功能):

$re = array("/'cKey1'\s*=>\s*\K[^,]*/", "/'cKey2'\s*=>\s*\K[^,]*/"); 

$repl = array('"foo"', '"bar"') 

echo preg_replace($re, $repl, $str); 

输出:

$data = array(
    'cKey1' => "foo", 
    'cKey2' => "bar", 
    ... 
); 
+0

这几乎为我做了。我使用'file_get_contents()'获得了代码示例的内容,但是我失去了一些开始行(可能由于<?php')。如果我在file_get_contents()周围使用'htmlspecialchars()',那么数据仍然是完美的,但是您的解决方案不会取代。有关于此的任何想法? –

+0

'串(478)“, ”2e73625b5179497a423434736e“, 'cKey2'=> ”036289E99EA6A48CBDA1DB247E“, '文件'=> 'V2/API /车博士/ exampleAPI2.0.1.php');'可以看到它切断开始标记和'$ data = array(' –

+0

'cat -vte V2/api/autoDoc/test.php <?php $ ^ I $ data = array($ ^ I^I'cKey1'=>“2e73625b5179497a423434736e”, $ ^ I^I'cKey2'=>“036289E99EA6A48CBDA1DB247E”,$ ^ I^I'file'=>'V2/api/autoDoc/exampleAPI2.0.1.php'$ ^ I); $ ^ I $ ' –

1

或者使用标记生成器像@Casimir说或者(如果你坚持使用正则表达式),你能想出某事。像下面这样:

$regex = "~ 
      'cKey\d+'   # search for cKey followed by a digit 
      .+?     # match everything lazily 
      ([\"'])    # up to a single/double quote (capture this) 
      (?P<string>.*?)  # match everything up to $1 
      \1     # followed by the previously captured group 
     ~x"; 
preg_match_all($regex, $your_string, $matches); 

如果你想与某事来取代它,可以考虑使用preg_replace_callback(),虽然你不是你的预期输出清晰。
参见a demo on regex101.com。感谢@WiktorStribiżew在评论中的澄清。

+0

当您将边界定义为双引号或单引号时,您应该依赖惰性点匹配,而不是取反的字符类。另外'(\“|')'=>'([\”'])' –

+0

@WiktorStribiżew:我重视您的意见,所以你会这么好的说为什么用偷懒点会是在这种情况下更好? – Jan

+0

与[' 'cKey1'=> “dsfaasdfasdfasd'fasdf”,'](https://regex101.com/r/fX2sL8/1)输入检查正则表达式。 –