2015-02-09 135 views
0

说我有这个字符串:fg_^"-kv:("value_i_want")frt。该字符串将保持不变,除了value_i_want - 可能会一直改变。这个小字符串隐藏在一个巨大的数据串中(不断变化),我已经保存在一个PHP变量中使用正则表达式提取值

有没有我可以做一个正则表达式的字符串,让我们说50000个字符来找到该字符串以上)不知道value_i_want是什么,然后在一个变量保存值 - 使用PHP

+3

通过字符串搜索的大小限制仅受您的php安装访问的内存量的限制。你可以用'/ fg _ \ ^“\ - kv:\(”(。*?)“\)frt/s'这样的方法来做到这一点。 – 2015-02-09 18:40:33

+0

你想说什么?这个'fg _ ^” - kv: (“......”)frt'是一个5000字的段落的子字符串? – diEcho 2015-02-09 18:41:34

+2

如果外面的东西总是不变的,你可以使用substr。 – Kevin 2015-02-09 18:42:47

回答

1

试试这个:

if (preg_match_all('/(?<=fg_\^\"\-kv:\(\")[a-z_]+(?=\"\)frt)/', $yourstring, $matches)) { 
    echo "Match was found <br />"; 
    echo $matches[0]; 
} 

模式:(?<=fg_\^\"\-kv:\(\")[a-z_]+(?=\"\)frt)

(?<=fg_\^\"\-kv:\(\") - 正回顾后一ssertion,意味着搜索的字符串应该是完全此字符串后:fg_^"-kv:("

(?=\"\)frt) - 正预测先行断言,意味着同样的,但在此之前: ")frt

[a-z_]+ - 你正在寻找的字符串,可以由一个或更多的字母和下划线。根据需要更改它。

演示:https://regex101.com/r/vS7dI0/1

+1

g修饰符在PHP中不存在(当你想找到几个出现的时候,你需要使用'preg_match_all')。因为您不使用锚点,所以不需要m修饰符。您应该为正则表达式字符串使用单引号,而不是转义所有双引号。无需在字符类外面跳出连字符。你写“为了你的需要而改变它”,但是如果对角色没有特别的限制会发生什么? – 2015-02-09 19:02:16

+0

感谢您的评论。 – streetturtle 2015-02-10 08:14:39

3

你可以使用strpos找到您想要的值。你可能需要调整这一点,我没有测试过。 $long_string是您正在搜索匹配的字符串。

$start = strpos($long_string, 'fg_^"-kv:("', 0); 
$end = strpos($long_string, '")frt', $start); 
$value_i_want = substr($long_string, $start+11, $end-$start-11); 
+0

如果字符串是一个常量,strpos的用法是比较可取的,因为它比preg_ *函数快得多。 – MarcoS 2015-02-09 18:49:23

+0

'strpos()'似乎不工作,当我正在寻找的字符串中有引号 – Lewison 2015-02-09 18:49:32

+0

它是抛出一个错误还是只是找不到它? – 2015-02-09 18:50:35