如何在php中使用正则表达式获得此结果?
请看下面的代码:
a.php只会
/*
*
-----------<jy:op>
{"name":"jimmy"}
-----------</jy:op>
-----------<jy:desc>
my name is jimmy
-----------</jy:desc>
*
*/
test.php
<pre>
<?php
$code=file_get_contents('a.php');
preg_match_all('@<jy:(\w+)>.*</jy:(\1)>@is',$code,$result);
print_r($result);
// how can i get this result using regexp in php?
// the regex before is not correct.
array(
'op'=>'{"name":"jimmy"}',
'desc'=>'my name is jimmy'
);
答案 0 :(得分:3)
问题可能是你的.*
尽可能多地匹配,直到你的第二个结束标记。要更改此行为,您可以将ungreedy修饰符设置为正则表达式:
preg_match_all('@<jy:(\w+)>.*</jy:(\1)>@iUs',$code,$result);
如果内容不能包含<
,您还可以使用此正则表达式:
preg_match_all('@<jy:(\w+)>[^<]*</jy:(\1)>@is',$code,$result);
没有让正则表达式变得非贪婪。
答案 1 :(得分:1)
你走了:
(?s)<jy:op>\R*(.*?)\r?\n.*?<jy:desc>\R*(.*?)\r?\n
使用preg_match检索第1组和第2组的匹配
在此处查看演示:http://regex101.com/r/xH8gF7