php|正規表現あれこれ

WordPressで商品を検索できるように制作。その際の仕様でURL末尾に「?」から始まるパラメータを付与した。

そのとき、ページ送りを作ると、パラメータ込みのURLの後ろに「/page/2/」などのページパラメータが入ることになりエラーとなる。
そこで正規表現でURLを書き換えてエラーを回避した

---------------------------
$paginate_html = [WP関数でページネーションHTMLを取得]

//バグフィクス:正規表現でパラメータ部をURL末尾に移動
$pattern = '/\/\?(.*?)\/page\/([0-9])\//';
$replace = '/page/$2/?$1';
$paginate_html = preg_replace($pattern, $replace, $paginate_html);

echo $paginate_html."\n";
---------------------------

今回のポイントだったのは「$1」「$2」の使い方。
要するに$patternの中で () でくくったパーツが$として順番に入ってくることになると理解。

***************************************************

引き続き、パラメータが複数付いた場合にエラーが発生。
paginate_links()で取得したリンク先URLに2つ目以降のパラメーターがもう一回出てきてカオスな状態w
原因は不明だが、関数自体が独自パラメータを付与する事を想定していないと思われる。

あまりスマートじゃないけれど、preg_replace()を段階的に複数回使用するなどして何とかクリア。
おおまかな手順・考え方としては下記の通り。

  1. $_SERVER["REQUEST_URI"]からpreg_split()でパラメータ部分だけ取得
  2. preg_replace()を何度か使って段階的にリンク先URLをパラメータだけついていない形に整形
  3. 最後に1番のパラメータ部分だけを末尾に付与

当初はHTMLソース内のパラメータ部分を活用する方向であれこれ試したけど複雑すぎて断念。そこで発想を転換。ページングなので現在ページのパラメータはそのまま生きることに気がつき、そこから引っ張ってくる方向で何とかなりました。

アーカイブ

ウェブページ

「紺屋の白袴」とはまさにこの事。見にくいしスマホ対応もまだしていません。そのうちやります。そのうちにね。

エフスタジオの中の人は株式会社メキメキに在籍しています。