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);

この例は改行で動作しますが、貪欲なので、これらの2つの解決策を検索して見ました:

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

しかし、どれも私にはうまくいきません。理由はわかりません

4

4 に答える 4

1

. . 構造がまったく同じ (コンテンツ内で常にインデントされている) 場合、 /\n[\s]+([^\n]+(\n[\s]+)*)\n/と簡単に一致させることができます。

. . 私は常に「怠惰な」(「貪欲でない」) 修飾子を避ける傾向があります。ハックのように見えるだけで、どこでも同じ実装で利用できるわけではありません。この場合は必要ないようですので、使用しないことをお勧めします。

. . これを試して:

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

. . 「$matches[1]」配列は、「機能」タグの内容の配列を取得します。

. . もちろん、不一致を避けるために、コンテンツを事前にフィルタリングし、コメントのコンテンツにのみ RegExp を適用するとよいでしょう。

. . 楽しむ。

于 2013-03-01T04:22:27.907 に答える
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

これを試して..

 /<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 に答える
0

[\s\S]の代わりに、すべてのスペース文字と非スペース文字を意味する、を使用してみてください.<funcion>また、</funcion>マッチグループに追加する必要はありません。

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

また、これを行うための最良の方法は、XMLパーサーを使用してXMLを解析することであることに注意してください。コメントで述べたように、XMLドキュメントでなくても、解析する必要のある部分を抽出し、XMLパーサーを使用して解析します。

于 2013-03-01T03:53:04.977 に答える