2011-12-29 12 views
0

を特定し、操作するpreg_replace_callbackを使用した:どこか次の形式でラテックス+ HTMLコードを有するラテックスコード

...some text1.... \[latex-code1\]....some text2....\[latex-code2\]....etc 

は、まず私はそれらを送信することができるように配列コード[]内ラテックスコードを取得します

...some text1.... <img src="root/1.png">....some text2....<img src="root/2.png">....etc 

code[0]=latex-code1, code[1]=latex-code2, etc 

は、第二に、私はそれがどのように見えるように、このテキストを変更するように、レンダリングのためのサーバーへ

、すなわち、i番目のラテックスコードフラグメントは、i番目のレンダリングされた画像へのリンクに置き換えられる。

私はpreg_replace_callbackとpreg_match_allでこれをやろうとしていましたが、PHPには新しくなっていませんでした。お知らせ下さい。

+0

これまでに試したことをコードに示してください。これまでに最も成功した点は何でしたか?それが複雑すぎる場合は、最初にマッチングのみから始めます。 – hakre

+0

preg_match_allを使ってラテックスコードを取得するには、次のようにします: $ pattern = '/(\ [)(。*)(\])/'; preg_match_all($パターン、$コンテンツ、$ラテックスコード、PREG_PATTERN_ORDER); これは今のところうまくいきません。私は$ latex_code [1]ですべてのラテックスコードを得ることができるはずです – user1120407

答えて

1

あなたがcodezを探しているなら:

$html = '...some text1.... \[latex-code1\]....some text2....\[latex-code2\]....etc'; 

$codes = array(); 
$count = 0; 
$replace = function($matches) use (&$codes, &$count) { 
    list(, $codes[]) = $matches; 
    return sprintf('<img src="root/%d.png">', ++$count); 
}; 
$changed = preg_replace_callback('~\\\\\\[(.+?)\\\\\\]~', $replace, $html); 

echo "Original: $html\n"; 
echo "Changed : $changed\n\nLatex Codes: ", print_r($codes, 1), "Count: ", $count; 

私はそれが正規表現パターンだ場合、あなたは重いエスケープを必要とするあなたのマーカーの内側の文字を使用し、あなたが問題を持っているどの部分で分かりません:PHPとPCREのために、スラッシュがたくさんあるのです。

もう1つのトリッキーな部分は、コードを収集するだけでなくカウンタを必要とするため、コールバック関数です。この例では、use節に変数の別名/参照を持つ匿名関数を使用しています。これにより、変数$codes$countがコールバック内で利用可能になります。

+0

私は正規表現のパターンに問題が走っていたと思います。これは本当に助けになりました。ありがとう! – user1120407

+0

こんにちは、PHPの下位バージョンの上記のコードと同等のバージョンを私に送ってもらえますか?私は私のサーバ(bravehost)上のPHPコンパイラによってコンパイルされていない$ replaceで匿名関数を使用していると思いますか? – user1120407

+0

PHP 5.3が必要です。 PHP 5.2でこれを行うには、コールバックをクラス関数にカプセル化して '$ codes'と' $ count'変数を利用できるようにする必要があります。 – hakre

関連する問題