LoginSignup
0

More than 5 years have passed since last update.

en-dashがpreg_matchにひっかからなくてハマった

Last updated at Posted at 2018-06-27
$text ='2007. p.149–170.';

こんなテキストがあって、ここから "149"と"170"をぬきだしたくて下記の正規表現をかいたんですが、これが全くマッチしない。

$text ='2007. p.149–170.';
if (preg_match('/(\d+)-(\d+)\./', $text, $match)) {
    var_dump($match);
}

で、ふと思いだしたのがハイフンって見た目同じでも違う文字コードの文字がいっぱいあったなってこと。(イヤですよねえ)

でググってみたらすぐわかったんですが、"149–170"の間にあるハイフンのような文字は ”en-dash” という文字のようです。

http://www.keyton-co.jp/blog/article/2017-2-14-unicode によるとMacではOption+"-"で入力できるようです。

どうやらen-dashは "149–170" のように範囲を表すときに使うみたいです。
文字コードはU+2013のようなのでハイフンの他にこのen-dashにもマッチするように正規表現を変更。

UTF-8として処理されるように u修飾子もつけて次のようになりました。

$text ='2007. p.149–170.';
if (preg_match('/(\d+)[-\x{2013}](\d+)\./u', $text, $match)) {
    var_dump($match);
}

なかなか気が付かないよなぁ。こいうの^^;

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0