2010-05-02 2 views
1

Я пытаюсь написать регулярное выражение, которое удаляет пути к файлам из ссылок и изображений.Regex удалить все, кроме имени файла из ссылок

href="path/path/file" to href="file" 
href="/file" to href="file" 
src="/path/file" to src="file" 

and so on... 

Я думал, что у меня это работает, но это портит, если есть два пути в строке она работает на. Я думаю, что мое выражение слишком жадно. Он находит последний файл во всей строке.

Это мой код, который показывает выражение Мессинг на тестовом входе:

<script type="text/javascript" src="/javascripts/jquery.js"></script> 
<script type="text/javascript"> 
    $(document).ready(function(){ 
     var s = '<a href="one/keepthis"><img src="/one/two/keep.this"></a>'; 
     var t = s.replace(/(src|href)=("|').*\/(.*)\2/gi,"$1=$2$3$2"); 
     alert(t); 
    }); 
</script> 

Это дает выход:

<a href="keep.this"></a> 

Правильный вывод должен быть:

<a href="keepthis"><img src="keep.this"></a> 

Спасибо за любые советы!

+1

вы должны работать над строками или вы можете сделать это в DOM Do? – Gumbo

+0

Если regexp действительно тяжело, я бы предпочел не работать в dom. Мне пришлось бы немного изменить структуру моей программы. Я думаю, единственная проблема в том, что мое регулярное выражение получает последнее/вместо самого последнего/перед другим ». – Moasely

ответ

0

Я бы предложил запустить отдельную замену регулярных выражений, одну для ссылок и другую для img, проще и понятнее, тем самым более удобную для обслуживания.

+0

Спасибо, мне, возможно, придется это сделать. Я тестирую новую версию, которая выглядит немного лучше: /(src | href) = "([^"] * \ /) * \ /? ([^ "] *)"/Gi, "$ 1 = \" $ 3 \ "" Мне придётся бежать через тесты и заставить работать с "или" – Moasely

0

Это похоже на работу в случае, если кто-то еще есть проблема:

var t = s.replace(/(src|href)=('|")([^ \2]*\/)*\/?([^ \2]*)\2/gi,"$1=$2$4$2"); 
0

Попробуйте добавить ?, чтобы сделать * кванторы нежадным. Вы хотите, чтобы они перестали соответствовать, когда столкнулись с символом окончания цитаты. Жадные версии будут иметь значение в конце последней цитаты, если в строке будет другая цитата, в которой будет найдено самое длинное совпадение; не-жадные найдут кратчайший возможный матч.

/(src|href)=("|').*?\/([^/]*?)\2/gi 

Также я изменил второй .* к [^/]*, чтобы позволить первому .* по-прежнему соответствует полный путь теперь, что это не жадный.

0

Он не должен быть регулярное выражение (в предположении, / разделителей):

var fileName = url.split('/').pop(); //pop takes the last element 
Смежные вопросы