2012-03-09 3 views
0

Я пытаюсь заменить HREF условием:PHP заменить HREF условием

http://www.sitea.com/vip: => http://localhost/aaa?search= 
http://www.sitea.com/  => http://localhost/bbb/ (without 'vip:') 
http://www.siteb.com/  => http://localhost/ccc/ 

Я использую strpos для судьи:

$str='<a href="http://www.sitea.com/vip:vp_14098">link A</a><a href="http://www.sitea.com/contact">link B</a><a href="http://www.siteb.com/player">link C</a>'; 
if(strpos($str,'www.sitea.com')!== false){ 
    if(strpos($str,'vip:')!== false){ 
     $str = str_replace('http://www.sitea.com/', 'http://localhost/aaa?search=',$str); 
    }else{ 
     $str = str_replace('http://www.sitea.com/', 'http://localhost/bbb/',$str); 
    } 
} 
if(strpos($str,'www.siteb.com')!== false){ 
    $str = str_replace('http://www.siteb.com/', 'http://localhost/ccc/',$str); 
} 
echo $str; 

Но этот выход:

<a href="http://localhost/aaa?search=vip:vp_14098">link A</a> 
<a href="http://localhost/aaa?search=contact">link B</a> 
<a href="http://localhost/ccc/player">link C</a> 

Вторая ссылка не замените, как я желаю.

ответ

1

О мальчик. Вы принимаете решения на основе результатов strpos, применяемых к строке, содержащей все ссылки. Поскольку $str содержит ссылку первого типа, соответствующее if-условие всегда истинно. Вы можете использовать регулярные выражения для решения этой проблемы, или если это не просто упрощенный пример, но ваш реальный мир код, попробуйте следующее:

$str='<a href="http://www.sitea.com/vip:vp_14098">link A</a><a href="http://www.sitea.com/contact">link B</a><a href="http://www.siteb.com/player">link C</a>'; 
$str = str_replace('http://www.sitea.com/vip:', 'http://localhost/aaa?search=vip:',$str); 
$str = str_replace('http://www.sitea.com/', 'http://localhost/bbb/',$str); 
$str = str_replace('http://www.siteb.com/', 'http://localhost/ccc/',$str); 
echo $str; 
+0

Если в '$ str' есть больше ссылок, как сделать разницу между' http: //www.sitea.com/vip: 'и' http: // www.sitea.com/', str_replace заменит от вершины до конца. Благодарю. – cj333

+0

Если вы сначала замените 'http: //www.sitea.com/vip:', то они исчезли из строки, не так ли? Поэтому, если вы замените все вхождения 'http: // www.sitea.com /', те, у кого 'vip:' в конце, не будут затронуты, потому что они уже заменены чем-то другим. Я не совсем уверен, отвечает ли это на ваш вопрос, но в противном случае вам нужно будет уточнить, в чем проблема. – Niko

+0

право, глупо меня. – cj333

0

Это потому, что вы пытаетесь разобрать каждый URL по-разному, и вы делают все они в одной строке. Str_replace ВСЕГДА находит: vip, потому что он находится в вашей всей строке.

Здесь будет сообщение, которое, вероятно, даст вам некоторые регулярные выражения, но это не моя область знаний. Вместо этого, я буду предлагать вам эти изменения в свой код:

<?php 
    $str='<a href="http://www.sitea.com/vip:vp_14098">link A</a><a href="http://www.sitea.com/contact">link B</a><a href="http://www.siteb.com/player">link C</a>'; 
    $str = str_replace('http://www.sitea.com/vip:', 'http://localhost/aaa?search=',$str); 
    $str = str_replace('http://www.sitea.com/', 'http://localhost/bbb/',$str); 
    $str = str_replace('http://www.siteb.com/', 'http://localhost/ccc/',$str); 
    echo $str; 
?> 
+0

, если в '$ str' есть больше ссылок, как сделать разницу между' http: //www.sitea.com/vip: 'и' http: // www.sitea.com/', следует ли использовать' preg_match 'сделать судью вместо' strpos' ?. Благодарю. – cj333

+0

Запустили ли вы этот код? Он будет делать то, что вы хотите. Попробуй! –

1

Это потому, что все ваши URLs находятся в одной и той же строке, так как он проходит через ваш код, он совпадает с «sitea.com» сравнение, и затем он сравнивает сравнение «vip:», а затем переходит в это и заменяет все вхождения «sitea» вашей заменой «aaa». Он никогда не попадает в строку замены «bbb», потому что $ str всегда содержит «vip».

Что вам нужно сделать, так это разделить вашу $ str на массив URL-адресов и обрабатывать каждый по отдельности.

Смежные вопросы