0

私が達成しようとしているのは、最終的にページ/カスタム投稿タイプのコンテンツをスクレイピングするかなり単純な正規表現パターンです。とりあえず、1 行の文字列をチェックしているだけです。

次の RegEx パターンは有効です (コピーして RegExr に貼り付けます - http://regexr.com )。

$pattern = "/\[jwplayer(.+?)?\]?]/g"; 
$videoTest = "[jwplayer config=\"top_10_videos\" mediaid=\"107\"]";
preg_match($videoTest, $pattern, $matches);
print_r($matches);`

ただし、出力は次のとおりです。

Array
(
    [0] => Array
        (
        )
)

私は他の正規表現パターン (単純なもの) をテストし、ネット (スタック オーバーフローを含む) を精査してこの特定の問題に対する答えを探しましたが、問題の解決には成功していません。上記の php コードは、WordPress v 3.5 の functions.php 内に配置されています。その情報が役に立ち、「wp_ajax」フックを使用して呼び出される場合。ajax フックは期待どおりに機能しています。

誰でも提供できるヘルプは素晴らしいでしょう!

ありがとう、ニック

4

1 に答える 1

3

g修飾子はPHPでは使用されませんpreg_match_all()代わりに使用してください。

さらに、 の引数のpreg_match順序が間違っています。引数は次の順序にする必要があります。

preg_match($pattern, $videoTest, $matches);

正規表現のドキュメントを読んでください。

正規表現を使用して文字列から内容を取得するより堅牢な方法は、できるだけ具体的にすることです。これにより、不正な形式のものが通過するのを防ぎます。例えば:

function getJQPlayer($string) {
    $pattern = '/\[jwplayer(?:\s+[\w\d]+=(["\'])[\w\d]+\\1)*\]/';
    preg_match_all($pattern, $string, $matches, PREG_SET_ORDER);
    foreach ($matches as & $match) {
        $match = array_shift($match);
    }
    return $matches ?: FALSE;
}
$videoTest  = "[jwplayer config=\"top_10_videos\" mediaid=\"107\"]";
$videoTest .= ",[jwplayer config=\"bottom_10_videos\" mediaid=\"108\"]";
echo '<pre>', print_r(getJQPlayer($videoTest), true);
于 2013-01-25T00:23:55.887 に答える