• ベストアンサー

部分文字列の置換

お世話になります。 <A href="index.php?page=aaa/bbbbb/cccc.xls"> という文字列からindex.php?page=を削除して、 <A href="aaa/bbbbb/cccc.xls"> としたいのですが、よくわかりません。 ereg_replace() preg_replace() など、調べて挑戦しているのですが、できません。 おわかりになる方、教えていただけないでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.7

#6のパターンは echo preg_replace('/index.php\?page=(?!.*\.html)/', '', $str); のように書き換えられますね。 後方参照はしない方が多分よいので、これを反映するとこうですか。 <?php $ary = array( '<A href="index.php?page=aaa/bbbbb/cccc.xls">', '<A href="index.php?page=aaa/bbbbb/cccc.html">', '<A href="index.php?page=aaa/bbbbb/cccc.htm">', '<A href="index.php?page=aaa/bbbbb/cccc.mp3">', '<A href="index.php?page=aaa/bbbbb/cccc.txt">' ); foreach ($ary as $str) { echo "$str -> "; echo preg_replace('/(index.php\?page=)(.*\.[^(html)])/', '$2', $str); echo "\n"; } echo "#####################\n"; foreach ($ary as $str) { echo "$str -> "; //echo preg_replace('/index.php\?page=((?!.*\.html).*)/', '$1', $str); echo preg_replace('/index.php\?page=(?!.*\.html)/', '', $str); echo "\n"; } <A href="index.php?page=aaa/bbbbb/cccc.xls"> -> <A href="aaa/bbbbb/cccc.xls"> <A href="index.php?page=aaa/bbbbb/cccc.html"> -> <A href="index.php?page=aaa/bbbbb/cccc.html"> <A href="index.php?page=aaa/bbbbb/cccc.htm"> -> <A href="index.php?page=aaa/bbbbb/cccc.htm"> <A href="index.php?page=aaa/bbbbb/cccc.mp3"> -> <A href="index.php?page=aaa/bbbbb/cccc.mp3"> <A href="index.php?page=aaa/bbbbb/cccc.txt"> -> <A href="index.php?page=aaa/bbbbb/cccc.txt"> ##################### <A href="index.php?page=aaa/bbbbb/cccc.xls"> -> <A href="aaa/bbbbb/cccc.xls"> <A href="index.php?page=aaa/bbbbb/cccc.html"> -> <A href="index.php?page=aaa/bbbbb/cccc.html"> <A href="index.php?page=aaa/bbbbb/cccc.htm"> -> <A href="aaa/bbbbb/cccc.htm"> <A href="index.php?page=aaa/bbbbb/cccc.mp3"> -> <A href="aaa/bbbbb/cccc.mp3"> <A href="index.php?page=aaa/bbbbb/cccc.txt"> -> <A href="aaa/bbbbb/cccc.txt">

rqg2010
質問者

お礼

sakusaker7さん、お早うございます。 大変ご丁寧に各種のパターンについてまで、チェックをしていただきありがとうございます。 ばっちりです。 どうもありがとうございます。

その他の回答 (6)

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.6

.htmlを除外するパターン。 <?php $ary = array( '<A href="index.php?page=aaa/bbbbb/cccc.xls">', '<A href="index.php?page=aaa/bbbbb/cccc.html">', '<A href="index.php?page=aaa/bbbbb/cccc.htm">', '<A href="index.php?page=aaa/bbbbb/cccc.mp3">', '<A href="index.php?page=aaa/bbbbb/cccc.txt">' ); foreach ($ary as $str) { echo "$str -> "; echo preg_replace('/(index.php\?page=)(.*\.[^(html)])/', '$2', $str); echo "\n"; } echo "#####################\n"; foreach ($ary as $str) { echo "$str -> "; echo preg_replace('/(index.php\?page=)((?!.*\.html).*)/', '$2', $str); echo "\n"; } <A href="index.php?page=aaa/bbbbb/cccc.xls"> -> <A href="aaa/bbbbb/cccc.xls"> <A href="index.php?page=aaa/bbbbb/cccc.html"> -> <A href="index.php?page=aaa/bbbbb/cccc.html"> <A href="index.php?page=aaa/bbbbb/cccc.htm"> -> <A href="index.php?page=aaa/bbbbb/cccc.htm"> <A href="index.php?page=aaa/bbbbb/cccc.mp3"> -> <A href="index.php?page=aaa/bbbbb/cccc.mp3"> <A href="index.php?page=aaa/bbbbb/cccc.txt"> -> <A href="index.php?page=aaa/bbbbb/cccc.txt"> ##################### <A href="index.php?page=aaa/bbbbb/cccc.xls"> -> <A href="aaa/bbbbb/cccc.xls"> <A href="index.php?page=aaa/bbbbb/cccc.html"> -> <A href="index.php?page=aaa/bbbbb/cccc.html"> <A href="index.php?page=aaa/bbbbb/cccc.htm"> -> <A href="aaa/bbbbb/cccc.htm"> <A href="index.php?page=aaa/bbbbb/cccc.mp3"> -> <A href="aaa/bbbbb/cccc.mp3"> <A href="index.php?page=aaa/bbbbb/cccc.txt"> -> <A href="aaa/bbbbb/cccc.txt"> 細かいこというと、aaa/hoge.htmlfiles/moge.txt みたいのも拾っちゃいますが それはそれということで。

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.5

とりあえず指摘だけ。 >echo preg_replace('/(index.php\?page=)(.*\.[^(html)])/', '$2', $str1); >最初の正規表現は、xlsだったら変換するもの、次のはhtmlでなければ変換するものです。 違います。 [^(html)] にマッチするのは、'h', 't', 'm', 'l', '(', ')' ではない 一文字ですから、拡張子がhtmlのものを除外するというのには使えません。

  • masa6272
  • ベストアンサー率66% (93/140)
回答No.4

<?php $str0 = '<A href="index.php?page=aaa/bbbbb/cccc.xls">'; $str1 = '<A href="index.php?page=aaa/bbbbb/cccc.html">'; echo preg_replace('/(index.php\?page=)(.*\.xls)/', '$2', $str0); echo "\n"; echo preg_replace('/(index.php\?page=)(.*\.xls)/', '$2', $str1); echo "\n"; echo preg_replace('/(index.php\?page=)(.*\.[^(html)])/', '$2', $str0); echo "\n"; echo preg_replace('/(index.php\?page=)(.*\.[^(html)])/', '$2', $str1); echo "\n"; ?> これで、できます。後方参照を使用しています。 最初の正規表現は、xlsだったら変換するもの、次のはhtmlでなければ変換するものです。

rqg2010
質問者

お礼

masa6272さん、お早うございます。 レスありがとうございます。 できました。ばっちりです。 どうもありがとうございました。

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.3

<A href="aaa/bbbbb/cccc.xls"> になればいいんですよね? <?php $html = '<A href="index.php?page=aaa/bbbbb/cccc.xls">'; $html = ereg_replace('index.php\?page=','', $html); print_r($html); これで <A href="aaa/bbbbb/cccc.xls"> こうなりますけど? 補足にあるパターンだと、* の直前にあるのは ')' なので カッコ対の中身が繰り返し現れるということになるのでマッチしないということになってます。

rqg2010
質問者

補足

sakusaker7さん、お早うございます。 すぐに、また、お返事を頂きありがとうございます。 Suziさんの方へも同様に補足させていただきましたが、 私の説明不足でして、 <A href="index.php?page=aaa/bbbbb/cccc.xls"> については、「index.php?page=」を削除して、 <A href="index.php?page=aaa/bbbbb/cccc.html"> については、処理をしない。 と、いうことなものですので。 教えていただいた方法ですと、拡張子が、何であっても削除されてしまいました。 どうも、説明不足で申し訳ありませんでした。

  • Suzi
  • ベストアンサー率38% (130/334)
回答No.2

index.php?page= だけを削除する正規表現なら、index.php.+?= ではどうでしょうか。 $html = ereg_replace('index.php.+?=, '', $html); か $html = ereg_replace('/index.php.+?=/', '', $html); とか。

rqg2010
質問者

補足

Suziさん、お早うございます。 早速お返事ありがとうございます。 私の説明不足でして、 <A href="index.php?page=aaa/bbbbb/cccc.xls"> については、「index.php?page=」を削除して、 <A href="index.php?page=aaa/bbbbb/cccc.html"> については、処理をしない。 と、いうことなものですので。 教えていただいた方法ですと、拡張子が、何であっても削除されてしまいました。 どうも、説明不足で申し訳ありませんでした。

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

>index.php?page= '?' がメタ文字なのを失念していてエスケープし忘れたとか? それ以外に思いつかないのですが、どんなパターンでトライしてだめだったか 補足していただけますか?

rqg2010
質問者

補足

sakusaker7さん、お早うございます。 こんなに早いレスありがとうございます。 $html = <A href="index.php?page=aaa/bbbbb/cccc.xls"> $html = ereg_replace('(index.php\?page=)*xls','*xls',$html); などと、やってみたのですが。 よろしくお願いいたします。

関連するQ&A