Я хочу конвертировать относительные URL, которые начинаются с ../stuff/more.php
в http://www.example.com/stuff/more.php
в моей ленте RSS.
Я использовал этот код PHP, чтобы сделать следующее:
$content = preg_replace("#(<\s*a\s+[^>]*href\s*=\s*[\"'])(?!http)([^\"'>]+)([\"'>]+)#", '$1http://www.example.com/$2$3', $content);
Результат неверно продуман, он возвращает URL, как это
http://www.example.com/../stuff/more.php
Обратите внимание на ../
часть не была удалена, пожалуйста, помогите!
Так в основном ..
Это то, что у меня есть: ../stuff/more.php
Вот что я получаю (после запуска кода выше): http://www.example.com/../stuff/more.php
Это то, что я ХОЧУ: http://www.example.com/stuff/more.php
Добавление (\. | \. \. | \ /) * Должно работать.
$ content = preg_replace («# (<\ С * а \ s + [^>]HREF \ s= \ s * [\ «‘]) (?! http) (../ | ../ | /) * ([^ \»‘>] +) ([\ «‘>] +) #»,’ $ 1http: //www.example.com/$3$4 ‘, $ content);
Кроме того, обратите внимание, что $ 2 $ 3 был изменен на $ 3 $ 4
Редактировать:
Сводится к одной альтернативе:
$content = preg_replace("#(<\s*a\s+[^>]*href\s*=\s*[\"'])(?!http)(\.\.\/)*([^\"'>]+)([\"'>]+)#", '$1http://www.example.com/$3$4', $content);
Почему бы вам просто не заменить первые 2 точки доменом?
$result = str_replace('..', 'http://www.example.com', $contet, 1);
использование $_SERVER[HTTP_HOST] $_SERVER[REQUEST_URI]
является глобальной переменной в PHP, чтобы получить абсолютный URL.
Ну, я начну смотреть на регулярное выражение. Большинство из них выглядит хорошо (на самом деле, у вас есть достаточно хорошее регулярное выражение здесь, я немного удивлен, что у вас возникли проблемы в противном случае!), Но конец немного странный — лучше вот так:
#(<\s*a\s+[^>]*href\s*=\s*[\"'])(?!http)([^\"'>]+)([\"']>)#
(Технически было бы лучше зафиксировать начальную цитату и убедиться, что она совпадает с конечной, но есть вероятность, что у вас не возникнет никаких проблем.
Удалить ../
Я бы сделал это отдельно от регулярных выражений:
foreach (array("<a href=\"http://../foo/bar\">",
"<a href=\"../foo/bar\">") as $content) {
echo "A content=$content<br />\n";
########## copy from here down to...
if (preg_match("#(<\s*a\s+[^>]*?href\s*=\s*[\"'])(?!http)([^\"'>]+)([\"']>)#", $content, $m)) {
echo "m=<pre>".print_r($m,true)."</pre><br />\n";
if (substr($m[2], 0, 3) == '../')
$m[2] = substr($m[2], 3);
$content = $m[1].'http://www.example.com/'.$m[2].$m[3];
}
######### copy from above down to HERE
echo "B content=$content<br />\n";
}
(Я включил мини-набор тестов вокруг того, что вы ищете — вам нужно будет взять только отмеченные строки внутри для вашего кода.)
Я нашел решение благодаря всем, кто помог мне в этом.
Вот код, который я использовал:
$content = preg_replace("#(<a href=\"\.\.\/)#", '<a href="http://www.example.com/', $content);
он ищет <a href="../
и заменить его на http://www.example.com/
это не общее, но это работает для меня.