2

我需要在这样的注释 php 文件中的一些标签中获取值

php code
/* this is a comment
!-
<titulo>titulo3</titulo>
<funcion>
   <descripcion>esta es la descripcion de la funcion 6</descripcion>
</funcion>
<funcion>
   <descripcion>esta es la descripcion de la funcion 7</descripcion>
</funcion>
<otros>
   <descripcion>comentario de otros 2a hoja</descripcion>
</otros>
-!
*/
some php code

所以你可以看到文件有换行符和重复的标签<funcion></funcion>,我需要获取每一个标签,所以我尝试了这样的事情:

preg_match_all("/(<funcion>)(.*)(<\/funcion>)/s",$file,$matches);

这个例子适用于换行符,但它很贪心,所以我一直在搜索并看到这两个解决方案:

preg_match_all("/(<funcion>)(.*?)(<\/funcion>)/s",$file,$matches);
preg_match_all("/(<funcion>)(.*)(<\/funcion>)/sU",$file,$matches);

但它们都不适合我,不知道为什么

4

4 回答 4

1

试试这个..

 /<funcion>((.|\n)*?)<\/funcion>/i

例如

$srting = "<titulo>titulo3</titulo>
<funcion>
   <descripcion>esta es la descripcion de la funcion 6</descripcion>
</funcion>
<funcion>
   <descripcion>esta es la descripcion de la funcion 7</descripcion>
</funcion>
<otros>
   <descripcion>comentario de otros 2a hoja</descripcion>
</otros>";

$result=preg_match_all('/<funcion>((.|\n)*?)<\/funcion>/i', $srting,$m);
print_r($m[0]);

这个输出

Array
(
    [0] => 
   esta es la descripcion de la funcion 6

    [1] => 
   esta es la descripcion de la funcion 7

)

演示

于 2013-03-01T04:13:11.363 回答
1

你的问题中的这个表达:

preg_match_all("/(<funcion>)(.*?)(<\/funcion>)/s", $file, $matches);
print_r($matches);

这将起作用,但只有 IF$file是包含 XML 的字符串;如果是文件名,则必须先获取内容:

preg_match_all("/(<funcion>)(.*?)(<\/funcion>)/s", file_get_contents($file), $matches);

另外,请记住,当您使用非贪婪模式时,PCRE 具有回溯限制。

于 2013-03-01T04:19:22.737 回答
1

. . 如果结构完全一样(总是在内容内缩进),您可以轻松地将其与/\n[\s]+([^\n]+(\n[\s]+)*)\n/匹配。

. . 我总是倾向于避免使用“懒惰”(“非贪婪”)修饰符。它只是看起来像一个 hack,它并不是随处可用并且具有相同的实现。由于在这种情况下您似乎不需要它,我建议您不要使用它。

. . 试试这个:

$regexp = '/<funcion>\n[\s]+([^\n]+(\n[\s]+)*)\n</funcion>/';
$works = preg_match_all($regexp, $file, $matches);
echo '<pre>';
print_r($matches);

. . "$matches[1]" 数组将为您提供一个包含 "funcion" 标签内容的数组。

. . 当然,最好预先过滤内容并将正则表达式应用于评论内容,以避免任何不匹配。

. . 玩得开心。

于 2013-03-01T04:22:27.907 回答
0

尝试使用[\s\S],这意味着所有空格和非空格字符,而不是.. 此外,无需在匹配组中添加<funcion>和。</funcion>

/<funcion>([\s\S]*?)<\/funcion>/s

另外,请记住,最好的方法是使用XML 解析器解析 XML 。即使它不是 XML 文档,正如您在评论中提到的那样,提取应该解析的部分并使用 XML 解析器来解析它。

于 2013-03-01T03:53:04.977 回答