- ベストアンサー
部分文字列の置換
お世話になります。 <A href="index.php?page=aaa/bbbbb/cccc.xls"> という文字列からindex.php?page=を削除して、 <A href="aaa/bbbbb/cccc.xls"> としたいのですが、よくわかりません。 ereg_replace() preg_replace() など、調べて挑戦しているのですが、できません。 おわかりになる方、教えていただけないでしょうか。
- みんなの回答 (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">
その他の回答 (6)
- sakusaker7
- ベストアンサー率62% (800/1280)
.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)
とりあえず指摘だけ。 >echo preg_replace('/(index.php\?page=)(.*\.[^(html)])/', '$2', $str1); >最初の正規表現は、xlsだったら変換するもの、次のはhtmlでなければ変換するものです。 違います。 [^(html)] にマッチするのは、'h', 't', 'm', 'l', '(', ')' ではない 一文字ですから、拡張子がhtmlのものを除外するというのには使えません。
- masa6272
- ベストアンサー率66% (93/140)
<?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でなければ変換するものです。
お礼
masa6272さん、お早うございます。 レスありがとうございます。 できました。ばっちりです。 どうもありがとうございました。
- sakusaker7
- ベストアンサー率62% (800/1280)
<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"> こうなりますけど? 補足にあるパターンだと、* の直前にあるのは ')' なので カッコ対の中身が繰り返し現れるということになるのでマッチしないということになってます。
補足
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)
index.php?page= だけを削除する正規表現なら、index.php.+?= ではどうでしょうか。 $html = ereg_replace('index.php.+?=, '', $html); か $html = ereg_replace('/index.php.+?=/', '', $html); とか。
補足
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)
>index.php?page= '?' がメタ文字なのを失念していてエスケープし忘れたとか? それ以外に思いつかないのですが、どんなパターンでトライしてだめだったか 補足していただけますか?
補足
sakusaker7さん、お早うございます。 こんなに早いレスありがとうございます。 $html = <A href="index.php?page=aaa/bbbbb/cccc.xls"> $html = ereg_replace('(index.php\?page=)*xls','*xls',$html); などと、やってみたのですが。 よろしくお願いいたします。
お礼
sakusaker7さん、お早うございます。 大変ご丁寧に各種のパターンについてまで、チェックをしていただきありがとうございます。 ばっちりです。 どうもありがとうございます。