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

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

WBOY
リリース: 2016-06-13 12:19:35
オリジナル
1050 人が閲覧しました

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

<a>123456</a><br />7890234<br /><a>123<br />789</a>
ログイン後にコピー

を使用する必要があります。 にないコンテンツのみを照合したいのです。つまり、
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 "
";
ログイン後にコピー

-----解決策----------------------
123456 にのみ一致します はい、削除すれば簡単です
残りは希望どおりです。
$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/ から入手できます。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート