6 に答える
私なら、HTML パーサーを見つけようとします。
もう 1 つのオプションは、文字列を<code>.*?</code>
および他の部分にチャンクしようとすることです。
他の部分を更新し、再結合します。
$x="The Hello \ World document is located in:\n<br>
<code>C:\documents\hello_world.txt</code>";
$r=preg_split("/(<code>.*?<\/code>)/", $x,-1,PREG_SPLIT_DELIM_CAPTURE);
for($i=0;$i<count($r);$i+=2)
$r[$i]=str_replace("\\","$\\backslash$",$r[$i]);
$x=implode($r);
echo $x;
これが結果です。
The Hello $\backslash$ World document is located in:
C:\documents\hello_world.txt
申し訳ありませんが、私のアプローチがあなたに適していない場合。
負の LookBehind や LookAheads を使用してこれを解決できると思います。
あなたは間違っていると思います。正規表現はパーサーの代わりにはなりません。
htmltidy を介して html をパイプ処理し、dom-parser でそれを読み取り、dom をターゲットの出力形式に変換することをお勧めします。このルートを取るのを妨げているものはありますか?
パーサーFTW、わかりました。ただし、パーサーを使用できず、<code>
タグがネストされていないことが確実な場合は、次のことを試すことができます。
- ファイルのセクションを検索
<code>.*?</code>
します (おそらくドット マッチ改行モードを有効にする必要があります)。 - そのセクション内のすべてのバックスラッシュを次のような一意のものに置き換えます
#?#?#?#
- 1 で見つかったセクションをその新しいセクションに置き換えます
- すべてのバックスラッシュを
$\backslash$
- als
<code>
と\begin{verbatim}
all</code>
を置き換えます\end{verbatim}
#?#?#?#
と置き換えます\
参考までに、PHP の正規表現は可変長の後読みをサポートしていません。そのため、この 2 つの境界間の条件付き一致が困難になります。
Pandoc?Pandocは一連のフォーマット間で変換します。たくさんのハエを連結して、それらを隠すこともできます。たぶん、いくつかのシェルスクリプトをphpスクレイピングスクリプトと組み合わせますか?
「期待される入力」とコマンドを使用するとpandoc -o text.tex test.html
、出力は次のようになります。
The Hello \textbackslash{} World document is located in:
\verb!C:\documents\hello_world.txt!
pandocは、stdinからの読み取り、stdoutへの書き込み、またはファイルへのパイプ処理を行うことができます。
<code>
ブロックがネストされていない場合、この正規表現は文字列の開始後または間にバックスラッシュを検出し^
ませ</code>
ん<code>
。
((?:^|</code>)(?:(?!<code>).)+?)\\
| | |
| | \-- backslash
| \-- least amount of anything not followed by <code>
\-- start-of-string or </code>
そしてそれを次のように置き換えます:
$1$\backslash$
この正規表現は「シングルライン」モードで実行する必要があるため、.
改行と一致します。また、グローバル置換を指定するだけでは不十分なため、複数回実行する必要があります。各置換は、文字列の開始または。の後の最初の適格な円記号のみを置換します</code>
。
DOMDocumentのようなHTMLまたはXMLパーサーに基づいてパーサーを記述します。解析されたDOMをトラバースし、ノードの子孫ではないすべてのテキストノードをで置き換え、ノード\
であるすべてのノードをで置き換えます。code
$\backslash$
code
\begin{verbatim} … \end{verbatim}