2

十分に正常に見える文字列(違いがある場合はMySQLデータベースから取得)があります:

Manufacture: <a href="http://www.x.com/">Blah</a>

問題は、Manufacture:<a>タグの間のスペースが、予想どおり 32 ではなく、194 の文字コードを持っていることです。

これpreg_matchにより、次のパターンの が失敗します (正規表現を使用して HTML を解析しようとする試みは無視してください。良い考えではないことはわかっていますが、この特定のデータセットは十分に予測可能であり、回避できます):

/Manufacture: *(<a[^>]*>([A-Za-z- 0-9]+)<\/a>)/i

テキスト エディターで不正なスペースを通常のスペース文字に置き換えて再試行すると、式は期待どおりに一致しますが、プログラムで変更する必要があります。

私が試したstr_replace

$text = str_replace(chr(194), ' ', $text);

しかし、preg_matchそれでも失敗します。私はそれから試しましたpreg_replace

$text = preg_replace('/[\xC2]/', ' ', $text);

しかし、同じパターンを実行すると予想される一致が含まれpreg_match ていても、それも機能しません。

誰にもアイデアはありますか?

4

2 に答える 2

4

$text の内容を取得する MySQL テーブルの構造を確認していただけますか? 照合がutf8_general_ciまたはそのようなものである場合、文字列に 2 バイトの UNICODE 文字が含まれている可能性が高くなります。

ここに画像の説明を入力

その場合は、PHP 関数のiconvでうまくいくはずです。PHP マニュアルの例を次に示します。このIGNOREオプションは、文字列から UNICODE 文字を削除する必要があります。

<?php
$text = "This is the Euro symbol '€'.";

echo 'Original : ', $text, PHP_EOL;
echo 'TRANSLIT : ', iconv("UTF-8", "ISO-8859-1//TRANSLIT", $text), PHP_EOL;
echo 'IGNORE   : ', iconv("UTF-8", "ISO-8859-1//IGNORE", $text), PHP_EOL;
echo 'Plain    : ', iconv("UTF-8", "ISO-8859-1", $text), PHP_EOL;

?>

上記の例では、次のようなものが出力されます。

Original : This is the Euro symbol '€'.
TRANSLIT : This is the Euro symbol 'EUR'.
IGNORE   : This is the Euro symbol ''.
Plain    :
Notice: iconv(): Detected an illegal character in input string in .\iconv-example.php on line 7
This is the Euro symbol '
于 2012-08-11T18:35:17.683 に答える
0

空白文字に一致させようとするとどうなりますか?
そのようです:

/Manufacture:\s*(<a[^>]*>([A-Za-z- 0-9]+)<\/a>)/i
于 2012-08-11T15:53:18.300 に答える