1

これが簡単な質問かどうかはわかりませんが、これまでのところ答えを見つけることができませんでした. タグがhtmlに変換されたときにタブを正しく保持していないように見えるため、.docxファイルを引き離し、すべての<w:tab />タグを<w:ind />タグに置き換える正規表現を作成しようとしています。<w:tab>私はPHPで作業していますが、これまでのところ、正しく行うために必要なことを行う正規表現を書くことに成功していません.

問題は、ここで単純な検索と置換機能を実行できないことです。タグを削除し、最も近い開始タグと終了タグ内に<w:tab />タグを挿入する必要があります。<w:ind /><w:rPr></w:rPr>

サンプルの XML 文字列は次のようになります。

    <w:p w14:paraId="2679030C" w14:textId="4E6FFA99" w:rsidR="00ED4314" w:rsidRPr="00254747" w:rsidRDefault="00ED4314" w:rsidP="00322270">
        <w:pPr>
            <w:pStyle w:val="NoSpacing" />
            <w:spacing w:line="480" w:lineRule="auto" />
            <w:jc w:val="both" />
            <w:rPr>
                <w:rFonts w:ascii="Times New Roman" w:hAnsi="Times New Roman" w:cs="Times New Roman" />
                <w:sz w:val="24" />
                <w:szCs w:val="24" />
            </w:rPr>
        </w:pPr>
        <w:r w:rsidRPr="00254747">
            <w:rPr>
                <w:rFonts w:ascii="Times New Roman" w:hAnsi="Times New Roman" w:cs="Times New Roman" />
                <w:sz w:val="24" />
                <w:szCs w:val="24" />
            </w:rPr>
            <w:tab />
            <w:t>SOME text</w:t>
        </w:r>
        <w:r w:rsidR="0003297C">
            <w:rPr>
                <w:rFonts w:ascii="Times New Roman" w:hAnsi="Times New Roman" w:cs="Times New Roman" />
                <w:sz w:val="24" />
                <w:szCs w:val="24" />
            </w:rPr>
            <w:t>SOME more text</w:t>
        </w:r>
        <w:r w:rsidRPr="00254747">
            <w:rPr>
                <w:rFonts w:ascii="Times New Roman" w:hAnsi="Times New Roman" w:cs="Times New Roman" />
                <w:sz w:val="24" />
                <w:szCs w:val="24" />
            </w:rPr>
            <w:t>EVEN more text</w:t>
        </w:r>
    </w:p>

したがって、の各インスタンスを<w:tab/>削除する必要があり、その後、前のタグまでさかのぼってその中に<w:rPr>タグを挿入する必要があり<w:ind />ます。

私がこれまでに持っているものは次のとおりです。

$content = preg_replace("/<w:rPr>(.*?)<\/w:rPr>(.*?)<w:tab\/>/", "<w:rPr><w:ind w:firstLine=\"720\"/>$1</w:rPr>$2", $content);

このような機能はありますが、問題は検索がグローバルすぎることです。貪欲にならないように指定していますが、返される結果には、本来よりもはるかに多くのコンテンツが含まれています。これを改善するための最適な方法を誰かが提案できますか? 前もって感謝します!

4

1 に答える 1

1

貪欲でないことと、タグを見つける前に停止することを「知っている」正規表現とを混同していると思いますが、それはできません。との間のタグを許可しない場合、これは大まかに機能するはずです。</w:rPr><w:tab/>

/<w:rPr>(.*?)<\/w:rPr>([^<]*?)<w:tab\/>/
                       ^^^^

これは否定された文字クラスと呼ばれ、そうでない すべての文字に一致します。<したがって、<w:tab/>.


編集。あなたの明確化に応じて、つまりを見つける前を除く すべてのタグを許可する 、否定的な先読みアサーションを使用する必要があります。正しく理解したように、否定された文字クラスは文字列ではなく文字のみを除外するためです。<w:rPr><w:tab/>

/<w:rPr>(.*?)<\/w:rPr>((?:(?!<w:rPr>).)*?)<w:tab\/>/
                       ^^^^^^^^^^^^^^^^

紛らわしい if は無視してください。これは、括弧を取得しない(?:xyz)ようにするための単なる方法です。ただし、数量詞,には括弧が必要です。ここで重要な部分は、否定先読みアサーションとして知られる です (ちなみに、非キャプチャ グループでもあります)。先読みして「xyz」が見つからない場合に一致します。つまり、上で行っていることは次のとおりです。 : (1) 先読み、(2) でない場合、(3) 1文字に一致、(4) aが見つかるまで繰り返します。*(?!xyz) <w:rPr>.<w:tab/>

于 2013-11-05T05:58:12.347 に答える