PHP: заменить относительный верхний URL & quot; ../& quot; с абсолютным URL домена

Я хочу конвертировать относительные 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

1

Решение

Добавление (\. | \. \. | \ /) * Должно работать.

$ 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);
1

Другие решения

Почему бы вам просто не заменить первые 2 точки доменом?

$result = str_replace('..', 'http://www.example.com', $contet, 1);
0

использование $_SERVER[HTTP_HOST] $_SERVER[REQUEST_URI] является глобальной переменной в PHP, чтобы получить абсолютный URL.

0

Ну, я начну смотреть на регулярное выражение. Большинство из них выглядит хорошо (на самом деле, у вас есть достаточно хорошее регулярное выражение здесь, я немного удивлен, что у вас возникли проблемы в противном случае!), Но конец немного странный — лучше вот так:

#(<\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";
}

(Я включил мини-набор тестов вокруг того, что вы ищете — вам нужно будет взять только отмеченные строки внутри для вашего кода.)

0

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

$content = preg_replace("#(<a href=\"\.\.\/)#", '<a href="http://www.example.com/', $content);

он ищет <a href="../ и заменить его на http://www.example.com/ это не общее, но это работает для меня.

0
По вопросам рекламы [email protected]