Как написать такое регулярное выражение в PHP? - PullRequest
0 голосов
/ 27 августа 2010
$contents = 'url("/test/what)';
echo preg_replace('/url\(([\'"]?)(?!(?:[a-z]+:)|\/|[\'"]\/)/i', 'url(\1'. '/prefix' . '\2', $contents);

Я хочу добавить /prefix к тем URL, которые не использовали абсолютный путь (начните с /), вышеприведенное работает, но довольно уродливо.

Есть ли более элегантное решение?

Ответы [ 3 ]

1 голос
/ 27 августа 2010

Попробуйте:

$regex = '~url\(([\'"]?)(?!/|[^:]+://)~';
echo preg_replace($regex, 'url($1' . '/prefix/', $contents);

Это очень похоже на ваше регулярное выражение, но я не думаю, что есть много возможностей для улучшения, если вы хотите использовать регулярное выражение для этого.* Демо: http://ideone.com/qeHna

0 голосов
/ 27 августа 2010

Использовать отрицательный взгляд вперед:

$contents = 'url("/test/what")';
$prefix = '/prefix';
$regex = '~url\(([\'"]?)(?!>/|[^:]+://)~';
echo preg_replace($regex, 'url($1' . $prefix, $contents),"\n";

вывод:

url("/prefix/test/what")
0 голосов
/ 27 августа 2010

, если ваша проблема - именно то, что вы опубликовали (т. Е. Правильно настроен атрибут css background), то почему бы просто:

if (substr($contents, 5, 1) != '/') 
    $contents = 'url("/prefix/' . substr($contents, 5);

EDIT: или если «перед URL может быть целая куча вещей» («», то

$pos = strpos($contents, 'url("') + 5;
if (substr($contents, $pos, 1) != '/')
   $contents = substr($contents, 0, $pos) . '/prefix/' . substr($contents, $pos);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...