ホームページ  >  記事  >  バックエンド開発  >  正規表現。負のゼロ幅アサーションを使用する必要があります

正規表現。負のゼロ幅アサーションを使用する必要があります

WBOY
WBOYオリジナル
2016-06-13 12:19:351004ブラウズ

正規表現を検索するには、負のゼロ幅アサーション
content

<a>123456</a><br />7890234<br /><a>123<br />789</a>

を使用する必要があります。3499910bf9dac5ae3c52d5ede73834855db79b134e9f6b82c0b36e0489ee08ed にないコンテンツのみを照合したいのです。つまり、
7890234<br /><a>123<br />789</a>

に一致する必要があります。以下は私が自分で書いた正規表現ですが、失敗しました
(?!<a.*?)\d+(?!.*<\/a>)

にアドバイスをいただければ幸いです。 ------解決策のアイデア------- ---------------
問題は解決しませんでしたが、解決までの過程

$str = <<<a>123456</a><br />7890234<br /><a>123<br />789</a>
EOF;
// 手册里面有一个 (?!pattern) 负向预查 应该就是 "负向零宽断言" 的意思吧
preg_match_all('/(?<=)\d+(?=<\/a>)/',$str,$m);// [0] => 123456
preg_match_all('/(?)\d+(?!<\/a>)/',$str,$t1);
/*
相邻的数字没有获取到
[0] => 2345
[1] => 7890234
[2] => 23
[3] => 78
单独测试 123
也是只能获取到 23
*/

$str_space = <<
123456
7890234
123
789

EOF;
preg_match_all('/(?)\d+(?!<\/a>)/',$str_space,$t2);
/*
而在 相邻的数字加一个空格就可以了
[0] => 123456
[1] => 7890234
[2] => 123
[3] => 789
*/
echo "
";
print_r($m);
print_r($t1);
print_r($t2);
echo "
";

-----解決策----------------------
3499910bf9dac5ae3c52d5ede73834851234565db79b134e9f6b82c0b36e0489ee08ed にのみ一致します はい、削除すれば簡単です
残りは希望どおりです。
$s =<<< TXT
<a>123456</a><br />7890234<br /><a>123<br />789</a>
TXT;

$p = '#\d+[\r\n]+#';
preg_match_all("/[^\r\n]+/", preg_replace($p, '', $s), $m);
print_r($m);
Array<br />(<br />    [0] => Array<br />        (<br />            [0] => 7890234<br />            [1] => <a>123<br />            [2] => 789</a><br />        )<br /><br />)<br /><br />

PHP の正規表現は最新の正規表現のすべての機能を完全に実現しているわけではなく、アサーションの実装は不完全であることに注意する必要があります
正規表現を学びたい場合は、それを学ぶ必要がありますC#とJava環境で行うことができます
実際に使用する必要がある場合は、頭を使って柔軟に使用してください

正規表現はPCRE(Perl互換正規表現)によってサポートされていますこれは、Philip Hazel によって作成されたオープンソース ソフトウェアであり、著作権は英国ケンブリッジ大学に属します。 ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/ から入手できます。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。