質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Q&A

解決済

1回答

422閲覧

PHP preg_match_all のパターンに変数を入れたい

shimon11

総合スコア49

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

0グッド

0クリップ

投稿2023/03/03 01:21

実現したいこと

以下のようなテキストから

PHP

1$string = ` 2<!-- wp:group {"blockId":"001"} --> 3<div class="wp-block-group"><!-- wp:paragraph --> 4<p>text1-1</p> 5<!-- /wp:paragraph --></div> 6<!-- /wp:group --> 7 8<!-- wp:group {"blockId":"002"} --> 9<div class="wp-block-group"><!-- wp:paragraph --> 10<p>text2-1</p> 11<!-- /wp:paragraph --></div> 12<!-- /wp:group --> 13`;

block_idを指定してその中のテキストの一部を取得したいです

001を指定したら

PHP

1<!-- wp:paragraph --> 2<p>text1-1</p> 3<!-- /wp:paragraph -->

が帰ってくるようにしたいです。

試したこと

PHP

1$pattern = '/<!--\s*wp:group\s{"blockId":"[0-9]{3}"}\s-->\s<div\s*class="wp-block-group">(.*?)<\/div>\s<!--\s*\/wp:group\s*-->/s'; 2 3preg_match_all($pattern, $string, $matches);

とすると$matches[1][0]でひとつめの

HTML

1<!-- wp:paragraph --> 2<p>text1-1</p> 3<!-- /wp:paragraph -->

は取得することはわかりました。

blockidの箇所を変数にして正規表現のパターンを変換したいのですが

PHP

1$block_id = '001'; 2// $block_idは外部から指定されます。 3$pattern = '/<!--\s*wp:group\s{"blockId":"' . $block_id .'"}\s-->\s<div\s*class="wp-block-group">(.*?)<\/div>\s<!--\s*\/wp:group\s*-->/s'; 4 5preg_match_all($pattern, $string, $matches);

このようにしてもWarning: preg_match_all(): Unknown modifier 'c' とエラーになります。

正規表現の値を変数にするにはどのようにすれば良いでしょうか

お心優しい方アドバイスいただければと思います

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

melian

2023/03/03 01:50

PHP 8.1.2 で実行してみましたが、"blockId":"001" の部分が正常に抽出されています。
guest

回答1

0

ベストアンサー

全部拾ってarray_filterで抽出すれば良いような気がします
どうしても正規表現でということなら$block_id内にメタ文字をふくみたいかどうかによります

PHP

1<?PHP 2 3$string = <<<eof 4<!-- wp:group {"blockId":"001"} --> 5<div class="wp-block-group"><!-- wp:paragraph --> 6<p>text1-1</p> 7<!-- /wp:paragraph --></div> 8<!-- /wp:group --> 9 10<!-- wp:group {"blockId":"002"} --> 11<div class="wp-block-group"><!-- wp:paragraph --> 12<p>text2-1</p> 13<!-- /wp:paragraph --></div> 14<!-- /wp:group --> 15eof; 16 17 18$block_id='001'; 19$pattern='@(?<=<!-- wp:group)*?{"blockId":"(?P<block_id>'.preg_quote($block_id,'@').')"}[\s\S]*?<div class="wp-block-group">(?P<inner_text>[\s\S]*?)</div>[\s\S]*?(?=<!-- /wp:group -->)@mis'; 20 21if(preg_match_all($pattern,$string,$m,PREG_SET_ORDER )){ 22 $m=array_map(function($x){ 23 $x=array_filter($x,function($x){ 24 return !is_numeric($x); 25 },ARRAY_FILTER_USE_KEY); 26 return $x; 27 },$m); 28 print_r($m); 29}

投稿2023/03/03 02:01

yambejp

総合スコア114572

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問