✅FirefoxでAmazonのページが動かない
2025/9/14
再現方法
対象ページにChrome, firefoxでシークレットモードでアクセス
問題の正体
Chrome
Unicode制御文字あり: 出版社 : 一迅社 (2022/4/27)
文字コード: " " (32), "" (8207), " " (32), ":" (58),
" " (32), "" (8206), " " (32)
Firefox
Unicode制御文字なし: 出版社 : 一迅社 (2022/4/27)
文字コード: " " (32), " " (32), ":" (58), " " (32)
結果
Chrome: 現在の正規表現 false、修正版正規表現 false →
実はChromeでも動いていない
Firefox: 現在の正規表現 false、修正版正規表現 true → 修正版なら動く
真実
1. 現在のコードはChromeでも実際は動いていない
2. Firefoxでは修正版正規表現で動く
3. Chromeにはさらなる対応が必要
ChromeでもFirefoxでも両方動くようにするには、両方のパターンに対応した正規
表現が必要ですね。
ChromeとFirefoxのinnerText実装の違いが原因
実際の違い
Chrome の innerText
出版社 : 一迅社 (2022/4/27)
文字コード:
code:zsh
- 4 "" (8207) - Right-to-Left Mark (RLM)
- 8 "" (8206) - Left-to-Right Mark (LTR)
Firefox の innerText
出版社 : 一迅社 (2022/4/27)
文字コード:
Unicode制御文字が除去され、通常のスペースのみ
Unicode制御文字とは
U+200E (LTR Mark) と U+200F (RLM Mark) は:
見た目には表示されない制御文字
文字の読み方向を指定するために使用
HTMLでは‎‎、‏‏として記述されることもある
ブラウザ実装の差異
Firefox (Gecko)
HTMLからinnerText取得時、Unicode制御文字をそのまま保持
より「生」のテキスト内容を返す
Chrome (WebKit/Blink)
HTMLからinnerText取得時、Unicode制御文字を正規化・除去
よりクリーンな表示用テキストを返す
W3C仕様との関係
innerTextの仕様では制御文字の扱いが曖昧で、ブラウザ実装に依存する部分があります
検証コード
code:js
const publisherRows = productDetails.filter((i) =>
i.innerText.includes("出版社"));
const publisherRow = publisherRows0;
// 文字コード確認
console.log("文字コード詳細:");
for (let i = 0; i < publisherRow.innerText.length; i++) {
const char = publisherRow.innerTexti;
console.log([${i}] "${char}" (${char.charCodeAt(0)}));
}
// 正規表現テスト
const regex1 = /出版社\s : \s(.*) \(.*\)/;
const regex2 = /出版社\s*:\s*(^(+)\s*\(/;
console.log("現在の正規表現:", regex1.test(publisherRow.innerText));
console.log("修正版正規表現:", regex2.test(publisherRow.innerText));
firefox
code:sh
文字コード詳細: debugger eval code:8:13
0 "出" (20986) debugger eval code:11:15
1 "版" (29256) debugger eval code:11:15
2 "社" (31038) debugger eval code:11:15
3 " " (32) debugger eval code:11:15
4 " " (32) debugger eval code:11:15
5 ":" (58) debugger eval code:11:15
6 " " (32) debugger eval code:11:15
7 "一" (19968) debugger eval code:11:15
8 "迅" (36805) debugger eval code:11:15
9 "社" (31038) debugger eval code:11:15
10 " " (32) debugger eval code:11:15
11 "(" (40) debugger eval code:11:15
12 "2" (50) debugger eval code:11:15
13 "0" (48) debugger eval code:11:15
14 "2" (50) debugger eval code:11:15
15 "2" (50) debugger eval code:11:15
16 "/" (47) debugger eval code:11:15
17 "4" (52) debugger eval code:11:15
18 "/" (47) debugger eval code:11:15
19 "2" (50) debugger eval code:11:15
20 "7" (55) debugger eval code:11:15
21 ")" (41) debugger eval code:11:15
現在の正規表現: false debugger eval code:17:13
修正版正規表現: true
chrome
code:sh
文字コード詳細:
VM2443:9 0 "出" (20986)
VM2443:9 1 "版" (29256)
VM2443:9 2 "社" (31038)
VM2443:9 3 " " (32)
VM2443:9 4 "‏" (8207)
VM2443:9 5 " " (32)
VM2443:9 6 ":" (58)
VM2443:9 7 " " (32)
VM2443:9 8 "‎" (8206)
VM2443:9 9 " " (32)
VM2443:9 10 "一" (19968)
VM2443:9 11 "迅" (36805)
VM2443:9 12 "社" (31038)
VM2443:9 13 " " (32)
VM2443:9 14 "(" (40)
VM2443:9 15 "2" (50)