2009-08-19 8 views
6

W JavaScript mam ciąg zawierający fragment DOM. Jak znaleźć i zastąpić atrybut src obrazu?Wyrażenie regularne w JavaScript - zastąpienie atrybutu src obrazu

Chciałbym zastąpić ścieżkę wszystkich obrazów nową ścieżką, ale zachowując nazwę obrazu. Nie wszystkie ścieżki są takie same i mogą pochodzić z różnych lokalizacji. Moje umiejętności wyrażania regularności są w najlepszym wypadku słabe.

Na przykład:

Change 

    <img src='path/to/image/name.jpg' /> 

into 

    <img src='newPath/name.jpg' /> 

Odpowiedz

7

Spróbuj tego:

str.replace(/src='(?:[^'\/]*\/)*([^']+)'/g, "src='newPath/$1'"); 
+0

nie wydaje się działać. zmienia "http://blog.internetnews.com/skerner/smk/testpilot.png" na "http: //newPath/blog.internetnews.com/skerner/smk/testpilot.png ' – redsquare

+0

To zrobi. Musisz użyć "src =" newPath/$ 2 "" jako zamiennik – Xetius

+0

Doskonały, wydaje się, że to wystarczy, okrzyki Xetius – redsquare

1
replace(/(.*)\/(.*)/, "newPath/$2"); 
+0

nie mogę tego zrobić, kończy się na "newPath />" – redsquare

+0

, co jest dziwne. To działało, gdy próbowałem go w tym: http://www.regular-expressions.info/javascriptexample.html – Xetius

+0

zobacz http://pastebin.me/95775a662ddb4f79da1f7beaa1d4749b – redsquare

9

Took odpowiedź gumbo i dodał kilka rzeczy do poprawy to:

  • Jeśli wejście ciąg zawiera coś inne niż <img> znaczniki, które mogą mieć atrybut a src - to nie będzie już pasować/zamieniać ich w postaci .

  • Atrybut src może być przy użyciu pojedynczego lub podwójnego cudzysłowu.

  • W teście nie ma znaczenia wielkość liter.

Wynikające w:

string.replace(/<img([^>]*)\ssrc=(['"])(?:[^\2\/]*\/)*([^\2]+)\2/gi, "<img$1 src=$2newPath/$3$2"); 
+0

cheers gnarf. – redsquare

1

przypadku korzystania z surowych (nie-DOM) danych, takich jak HTML w postaci łańcucha, powyżej nie pasuje cudzysłów znaków. Kod ten może okazać się przydatny także:

root  = serviceURL("file") + "&src=" + encodeURIComponent(root); 
// html itself 
html  = html.replace(/src=['"](?:[^"'\/]*\/)*([^'"]+)['"]/g, "src='" + root + "/$1'"); 
+0

Znacznie lepsze rozwiązanie –

0

powyższych rozwiązań nie działa dobrze w moim przypadku, gdzie musiałem wymienić całą ścieżkę względną do ścieżki bezwzględnej przed zapisaniem go w DB. Ale oto moje rozwiązanie w przypadku pracy w kopalni dla kogokolwiek innego. Twoje zdrowie.

replace(/<img([^>]*)\ssrc=(['"])(\/[^\2*([^\2\s<]+)\2/gi, "<img$1 src=$2" + BaseURL + "$3$2"); 
0

Kiedyś te wyrażenia w moim projekcie, działało jak uroku, obsługa wszystkich takich przypadkach, cytuję, podwójny cudzysłów, wielu tagów graficznych w tekście itp w JavaScript

text.replace(/\<img([^>]*)\ssrc=('|")([^>]*)\2\s([^>]*)\/\>/gi, "<img$1 src=$2newPath/$3$2 $4/>"); 

W PHP

preg_replace('/\<img([^>]*)\ssrc=(\'|\")([^>]*)\2\s([^>]*)\/\>/', "<img$1 src=$2newPath/$3$2 $4/>",$text); 
Powiązane problemy