質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

タグ

特殊な記法により文書に埋め込む形で記述される付加情報をタグと呼びます。文書構造や書式、文字飾りなどを指示したり、画像や他の文書へのリンクを埋め込むことができる。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

2回答

1508閲覧

文字列内のHTMLタグ以外の二重引用符(ダブルクォーテーション)を変換したい

Samonasu

総合スコア16

XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

タグ

特殊な記法により文書に埋め込む形で記述される付加情報をタグと呼びます。文書構造や書式、文字飾りなどを指示したり、画像や他の文書へのリンクを埋め込むことができる。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

1クリップ

投稿2020/10/25 10:08

編集2020/10/25 11:11

前提・実現したいこと

HTMLタグを含む1行の長い文字列から、HTMLタグに含まれない二重引用符(ダブルクォーテーション)を全角のダブルクォーテーションに変換したいです。
ちなみに、このテキストはWordPressから吐き出されたものであり、タグの中はまだしも、タグ以外の部分に入るテキスト(二重引用符も含む)にはある程度の自由度があります。

※追記
こちらの文字変換はWordPressでrss用のxmlを吐き出すために行います。ですので使える言語はPHPかWordPressで用意されたメソッド等のみになります。
jsを使用できる場合の変換方法は「yambejp」さんにご回答いただきました。その点でお悩みの方は「yambejp」さんのご回答を参考になさってください。

対象の文字列の例です。

<p class="text">こんにちはは"日本語"<img src="image.jpg" alt="">ですが、ハローは"English"です。</p>

発生している問題・エラーメッセージ

上記の例でいうと「日本語」と「English」を囲む二重引用符のみ全角に置き換えたいのですが解決策がわかりません。

試したこと

正規表現で該当の二重引用符のみ置換するのがスタンダードな方法かと思ったのですが、該当部分のみを抽出する正規表現がわからず…
phpやWordPressのメソッドで良いものがないか探ってみましたが見つからず…
タグを囲む<>に挟まれた二重引用符のみ別の文字(文中にはいらなそうな文字)に置き換え、文中に残った二重引用符を全角に置き換え、タグ内の別の文字をもとに戻す…という方法も考えたのですが、そもそも<>に囲まれた二重引用符のみを抽出する方法もわからず…
といった状態です。

補足情報(FW/ツールのバージョンなど)

PHP : 7.4.11
WordPress : 5.5.1

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

javascript

1var orgStr="\""; 2var newStr="_"; 3var html=`<p class="text">こん<span>に"ち"は</span>は"日本語"<img src="image.jpg" alt="">ですが、ハローは"English"です。</p>`; 4var dummy=Object.assign(document.createElement('div'),{innerHTML:html}); 5var nodes=[...dummy.querySelectorAll('*')].map(x=>[...x.childNodes]).flat().filter(x=>x.nodeName=="#text"); 6var reg=new RegExp(orgStr,"g"); 7nodes.forEach(x=>{ 8 if(reg.test(x.nodeValue)) x.nodeValue=x.nodeValue.replace(reg,newStr); 9}); 10console.log(dummy.innerHTML);

投稿2020/10/25 10:42

yambejp

総合スコア115010

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Samonasu

2020/10/25 11:04

迅速な回答ありがとうございます! ご回答いただいたjsのコードでタグの外の二重引用符のみを任意の文字に変換できました。 しかし、私がお伝えし忘れていたのですがこちらの変換はrss用のxmlを吐き出す際に使おうと思っておりました。そのためjsを実行できる環境ではありませんでした。 せっかくご回答いただいたのに申し訳ありません。 上記の条件は質問文内に追記いたします。
guest

0

自己解決

PHPのみで変換する方法、自己解決しました。
あまりスマートな方法ではありませんが、explodeで全てバラし<>の個数でタグの中か外かを判別する方法で実現できました。
この質問を見て解決方法を探っていただいた方々、特にjsでの解決法をご回答いただいた「yambejp」さんに深く感謝申し上げます。

PHP

1/** 変換したい文字列 */ 2$content = '<p class="text">こんにちはは"日本語"<img src="image.jpg" alt="">ですが、ハローは"English"です。</p>'; 3/** explodeを使い「"」で分解 */ 4$exploded_content = explode('"', $content); 5 6$result = ''; 7foreach($exploded_content as $key => $text) { 8 /** 「<」の数 */ 9 $match_lt = preg_match_all('/</', $text); 10 /** 「>」の数 */ 11 $match_gt = preg_match_all('/>/', $text); 12 /** 「<」と「>」の数が同じときはタグの中と判断し「"(半角)」を、そうでないときは「"(全角)」を代入 */ 13 $joint = $match_lt === $match_gt ? '"' : '”'; 14 // 繰り返しの1回目のみ$jointの判定が反転する 15 if($key === 0) $joint = $match_lt === $match_gt ? '”' : '"'; 16 // テキストと二重引用符を結合して代入 17 $result .= $text.$joint; 18} 19// 最後の二重引用符は不要なので削除 20$content = mb_substr($result, 0, -1, "UTF-8");

投稿2020/10/25 13:05

Samonasu

総合スコア16

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問