1

このスクリプトは、コードでbb-codeのようなタグを使用できるように作成しました。最良の方法を決定し、 bbタグを動的に置き換える方法を尋ねた後、多くの時間を費やしましたか?、preg_replace_callbackを使用することにしました。

ただし、同じ行に複数のアイテムがある場合は問題があります

Man [forvo=man,nl]
Mannen [forvo=mannen,nl]

上記の部分は機能しますが、以下は機能しません。

Kip [forvo=kip,nl] - Kippen [forvo=kippen,nl]
Bal [forvo=bal,nl] - Ballen [forvo=ballen,nl]
Vrouw [forvo=vrouw,nl] - Vrouwen [forvo=vrouwen,nl]

file_get_contents()の使用は推奨されるオプションではないことは知っていますが、1行に複数のForvoタグを使用する場合は、preg_replace_callbackの別の解決策も見つける必要がありますか?

<?php
// Replace forvos in the lesson
$lesson_body = $lesson['Lesson']['body'];

function forvize($match) {
    $word = $match[1];
    $language = $match[2];
    $link = "http://apifree.forvo.com/action/word-pronunciations/format/js-tag/word/".$word."/language/".$language."/order/rate-desc/limit/1/key/API_KEY/";
    $link = file_get_contents($link);
    return $link;
}

//URL's
$lesson_body = preg_replace_callback("/\[forvo\=(.*),(.*)\]/", 'forvize', $lesson_body);

?>
4

2 に答える 2

0

あなたがした間違いはよくあることです。デフォルトでは、FULL STOP ( 、ドット.とも呼ばれます) は、改行以外の任意の文字に一致します。したがって、行に単一の bbcode がある場合、これは問題ありません。

/\[forvo\=(.*),(.*)\]/

しかし、1 行に 1 つ以上の bbcode がある場合、ドットはパターンに一致するのにできるだけ時間がかかります。

[forvo=aaaa,bbbbb] ... [forvo=cccc,dddd]
       (.*                       ),(.*)

代わりにできることは、最初のパラメーターを COMMA ( ,) 以外のすべての文字に制限し、2 番目のパラメーターを RIGHT SQUARE BRACKET ( ]) 以外のすべての文字に制限することです。

例:

/\[forvo\=([^,]*),([^\]]*)\]/
于 2012-12-13T02:25:49.687 に答える
0

それらをキャッチする方法は、貪欲でない量指定子 (別名、疑問符) を使用して、パターン内で次の文字が最初に出現するまですべてをキャッチすることです。

~\[forvo=(.*?),(.*?)\]~

  • 括弧で囲まれた最初のグループは、等号から最初のカンマまでのすべてに一致します
  • 2 番目のものは、コンマの後に閉じ角括弧までのすべてに一致します

もう 1 つのオプションは、特定の文字 (この場合はそれぞれカンマと閉じ括弧) 以外をキャッチするようにすることです。@hakreの回答をチェックして、それがどのように行われるかを確認してください。

于 2012-12-13T03:08:29.067 に答える