0

私は最近、二重引用符を開始/終了の二重引用符のペアに置き換えるパターンを使用しました。

$string = preg_replace('/(\")([^\"]+)(\")/','“$2”',$string);

$string が文、たとえ段落であっても問題なく動作します。

しかし…</p>

私の関数は、HTML コードのチャンクのジョブに対して呼び出すことができますが、例外として機能しなくなりました。

$string    = preg_replace('/(\")([^\"]+)(\")/','“$2”','<a href="page.html">Something "with" quotes</a>');

戻り値

<a href=“page.html”&gt;Something “with” quotes</a>

そして、それは問題です…

そこで、タグ内のテキストを抽出し、引用符を置き換えるという 2 つのパスで実行できると考えました。

私はこれを試しました

$pattern='/<[^>]+>(.*)<\/[^>]+>/';

たとえば、文字列が

$string='<a href="page.html">Something "with" quotes</a>';

ただし、次のような文字列では機能しません。

$string='Something "with" quotes <a href="page.html">Something "with" quotes</a>';

何か案が?

ベルトラン

4

4 に答える 4

1

通常の回答だと思います... 既に指摘されているように、HTML を Regex で解析するべきではありません。PHP Simple DOM Parseを見て、テキストを抽出し、正規表現を適用することができます。これは、すでに述べたことから、うまく機能しているようです。

このチュートリアルは正しい方向に導くはずです。

于 2013-09-25T14:27:17.350 に答える
0
于 2013-09-25T15:27:29.123 に答える
0

バートランド、この質問を復活させたのは、コールバックの必要がなく、一度に置換できる簡単な解決策があったからです。( regex のパターンを除外する方法に関する一般的な質問について調査を行っているときに、質問を見つけました。)

簡単な正規表現は次のとおりです。

<[^>]*>(*SKIP)(*F)|"([^"]*)"

交代試合の左側は完了し<tags>、故意に失敗します。右側は二重引用符で囲まれた文字列に一致します。左側の式と一致しなかったため、これらが正しい文字列であることがわかります。

このコードは、正規表現の使用方法を示しています (オンライン デモの下部にある結果を参照してください)。

<?php
$regex = '~<[^>]*>(*SKIP)(*F)|"([^"]*)"~';
$subject = 'Something "with" quotes <a href="page.html">Something "with" quotes</a>';
$replaced = preg_replace($regex,"“$1”",$subject);
echo $replaced."<br />\n";
?>

参照

s1、s2、s3... の状況を除いて、パターンを一致させる (または置き換える) 方法

于 2014-05-21T06:32:22.817 に答える
0

私は最終的に方法を見つけました:

  1. タグ (存在する場合) の内側または外側 (前、後) にあるテキストを抽出します。
  2. コールバックを使用してペアで引用符を見つけ、それらを置き換えます。

コード

$string = preg_replace_callback('/[^<>]*(?!([^<]+)?>)/sim', create_function('$matches',  'return preg_replace(\'/(\")([^\"]+)(\")/\', \'“$2”\', $matches[0]);'), $string);
于 2013-09-26T09:35:51.643 に答える