如何在PHP中使用正则表达式获得此结果?

时间:2014-05-06 06:18:04

标签: php regex

如何在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'
);

2 个答案:

答案 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