2 etiket arasındaki tüm metni seçmenin en iyi yolu nedir - ör: sayfadaki tüm 'ön' etiketler arasındaki metin.
/<div>.*?<\/div>/.exec("<div><div></div></div>")
2 etiket arasındaki tüm metni seçmenin en iyi yolu nedir - ör: sayfadaki tüm 'ön' etiketler arasındaki metin.
/<div>.*?<\/div>/.exec("<div><div></div></div>")
Yanıtlar:
Sen kullanabilirsiniz "<pre>(.*?)</pre>"
(istediğiniz herhangi bir metni ile ön değiştirme) ve ilk grubu ayıklamak (daha spesifik talimatlar için bir dil belirtin) ama bu çok basit ve geçerli HTML olduğunu basit kavramı varsayar.
Diğer yorumcuların önerdiği gibi, karmaşık bir şey yapıyorsanız bir HTML ayrıştırıcı kullanın.
<pre>
Denedikten sonra hala etiketleri görüyorsanız <pre>(.*?)<\/pre>
, bunun nedeni (. *?) Yakalama grubu yerine Tam eşleme tarafından yakalananlara bakmanızdır. Sesler cheesy ama hep düşünüyorum çünkü sürece "hırsızlar parantez = çifti" (
bir takip eder ?
gibi (?:
ya (?>
da her maç iki yakalar sahip olacaktır: yakalama grubu için tam eşleşme & 1 için 1. Her ek parantez kümesi ek bir yakalama ekler. Çalıştığınız dilde her iki görüntüyü nasıl alacağınızı bilmeniz yeterlidir.
Etiket başka bir satırda tamamlanabilir. Bu yüzden \n
eklenmesi gerekiyor.
<PRE>(.|\n)*?<\/PRE>
(.|\n)*?
Birden çok satırda HTML etiketleriyle uğraşırken ekleme konusunda önemli nokta . Seçilen cevap yalnızca HTML etiketleri aynı satırdaysa çalışır.
(.|\n)*?
karakterle eşleştirmek için asla kullanmayın . Her zaman (tek satırlı) değiştirici .
ile kullanın s
. Veya [\s\S]*?
geçici bir çözüm.
/\*(.|\n)*?\*/
hangi iş yaptı - teşekkür ederim
(?<=(<pre>))(\w|\d|\n|[().,\-:;@#$%^&*\[\]"'+–/\/®°⁰!?{}|`~]| )+?(?=(</pre>))
Temel olarak yaptığı şey:
(?<=(<pre>))
Seçim <pre>
etiketle başlamalıdır
(\w|\d|\n|[().,\-:;@#$%^&*\[\]"'+–/\/®°⁰!?{}|~]| )
Bu sadece uygulamak istediğim normal bir ifade. Bu durumda, örnekte köşeli parantez içinde listelenen harf, rakam veya satırsonu karakterini veya bazı özel karakterleri seçer. Boru karakteri |
basitçe " VEYA " anlamına gelir .
+?
Artı karakter, yukarıdakilerden birini veya daha fazlasını seçmek için durum belirtisi önemli değildir. Soru işareti varsayılan davranışı 'açgözlü' durumdan 'ungreedy' olarak değiştirir.
(?=(</pre>))
Seçim </pre>
etikete eklenmelidir
Kullanım durumunuza bağlı olarak ( i veya m ) gibi bazı değiştiriciler eklemeniz gerekebilir
Burada bu aramayı Sublime Text'de gerçekleştirdim, böylece normal ifademde değiştiriciler kullanmak zorunda kalmadım.
Yukarıdaki örnek PHP, Perl, Java gibi dillerle iyi çalışmalıdır ... Javascript, lookbehind'i desteklemediğinden (?<=(<pre>))
, bir tür geçici çözümü kullanmayı unutmamalıyız . Belki de burada olduğu gibi her seçim için sonuçlarımızdan ilk dört karakteri
soyun Regex etiketleri arasındaki eşleşme metni
Ayrıca yakalamayan parantezler için JAVASCRIPT REGEX DOKÜMANTASYONUNA bakın
öğe arasında içerik almak için aşağıdaki kalıbı kullanın. [tag]
İçeriği çıkarmak istediğiniz gerçek öğeyle değiştirin .
<[tag]>(.+?)</[tag]>
Bazen etiketler, anchor
etiket sahibi gibi özelliklere sahip olur href
, ardından aşağıdaki kalıbı kullanır.
<[tag][^>]*>(.+?)</[tag]>
<[tag]>
maç olacak <t>
, <a>
ve<g>
Replace [tag] with the actual element you wish to extract the content from
kısmı kaçırdın .
[]
tamamen atlanmış olmalıydı. Bu, RegEx'teki anlamları ve insanların önce kodu
Sınırlayıcı etiketleri hariç tutmak için:
(?<=<pre>)(.*?)(?=</pre>)
(?<=<pre>)
sonra metin arar <pre>
(?=</pre>)
daha önce metin arar </pre>
Sonuçlar pre
etiketin içindeki metni
HTML ile regexes ayrıştırmaya çalışmamalısınız bu soruyu görün ve nasıl ortaya çıktığını görün.
En basit terimlerle, html normal bir dil değildir, bu yüzden düzenli ifadelerle tam olarak ayrıştıramazsınız.
Yuvalanmış benzer etiket olmadığında html alt kümelerini ayrıştırabileceğinizi söyledikten sonra. Dolayısıyla, etiketin kendisi arasında ve dışında bir şey olmadığı sürece, bu işe yarayacaktır:
preg_match("/<([\w]+)[^>]*>(.*?)<\/\1>/", $subject, $matches);
$matches = array ( [0] => full matched string [1] => tag name [2] => tag content )
Daha iyi bir fikir, html'nizi yüklemek için yerel DOMDocument gibi bir ayrıştırıcı kullanmak, ardından etiketinizi seçmek ve böyle bir şeye benzeyebilecek iç html'yi almaktır:
$obj = new DOMDocument();
$obj -> load($html);
$obj -> getElementByTagName('el');
$value = $obj -> nodeValue();
Ve bu uygun bir ayrıştırıcı olduğu için yuvalama etiketlerini vb.
php
. PHP'nin resme nasıl geldiğinden emin değilim ...
Bunu dene....
(?<=\<any_tag\>)(\s*.*\s*)(?=\<\/any_tag\>)
Bu cevap etrafa bakmak için destek gerektirir! Bu, açılış ve kapanış etiketi çiftleri arasındaki tüm metni tanımlamamı sağladı. '>' Ve '<' arasındaki tüm metin budur. Etrafında çalışır çünkü etrafına baktığı karakterleri tüketmez.
(? <=>) ([\ \ W s] +) (? = </)
Bu HTML parçasını kullanarak https://regex101.com/ adresinde test ettim .
<table>
<tr><td>Cell 1</td><td>Cell 2</td><td>Cell 3</td></tr>
<tr><td>Cell 4</td><td>Cell 5</td><td>Cell 6</td></tr>
</table>
Bu üç bölümden oluşan bir oyun: arkaya bakış, içerik ve ileriye bakış.
(?<=>) # look behind (but don't consume/capture) for a '>'
([\w\s]+) # capture/consume any combination of alpha/numeric/whitespace
(?=<\/) # look ahead (but don't consume/capture) for a '</'
Ben 10 için bir başlangıç olarak hizmet umuyoruz. Şans.
var str = "Lorem ipsum <pre>text 1</pre> Lorem ipsum <pre>text 2</pre>";
str.replace(/<pre>(.*?)<\/pre>/g, function(match, g1) { console.log(g1); });
Kabul edilen cevap javascript kodu olmadığından, şunu ekleyerek:
preg_match_all(/<pre>([^>]*?)<\/pre>/,$content,$matches)
bu normal ifade etiket arasındaki her şeyi seçecektir. yeni çizgide olursa olsun (çok satırlı çalışın.
Python'da, DOTALL
bayrağın ayarlanması yeni satırlar dahil her şeyi yakalar.
DOTALL bayrağı belirtilmişse, bu yeni satır dahil herhangi bir karakterle eşleşir. docs.python.org
#example.py using Python 3.7.4
import re
str="""Everything is awesome! <pre>Hello,
World!
</pre>
"""
# Normally (.*) will not capture newlines, but here re.DOTATLL is set
pattern = re.compile(r"<pre>(.*)</pre>",re.DOTALL)
matches = pattern.search(str)
print(matches.group(1))
python example.py
Hello,
World!
Bir belgedeki tüm açılış ve kapanış etiketleri arasında metin yakalamak finditer
için kullanışlıdır. Aşağıdaki örnekte <pre>
, dizede üç açılış ve kapanış etiketi bulunmaktadır.
#example2.py using Python 3.7.4
import re
# str contains three <pre>...</pre> tags
str = """In two different ex-
periments, the authors had subjects chat and solve the <pre>Desert Survival Problem</pre> with a
humorous or non-humorous computer. In both experiments the computer made pre-
programmed comments, but in study 1 subjects were led to believe they were interact-
ing with another person. In the <pre>humor conditions</pre> subjects received a number of funny
comments, for instance: “The mirror is probably too small to be used as a signaling
device to alert rescue teams to your location. Rank it lower. (On the other hand, it
offers <pre>endless opportunity for self-reflection</pre>)”."""
# Normally (.*) will not capture newlines, but here re.DOTATLL is set
# The question mark in (.*?) indicates non greedy matching.
pattern = re.compile(r"<pre>(.*?)</pre>",re.DOTALL)
matches = pattern.finditer(str)
for i,match in enumerate(matches):
print(f"tag {i}: ",match.group(1))
python example2.py
tag 0: Desert Survival Problem
tag 1: humor conditions
tag 2: endless opportunity for self-reflection
Kullanabilirsiniz Pattern pattern = Pattern.compile( "[^<'tagname'/>]" );
<pre>([\r\n\s]*(?!<\w+.*[\/]*>).*[\r\n\s]*|\s*[\r\n\s]*)<code\s+(?:class="(\w+|\w+\s*.+)")>(((?!<\/code>)[\s\S])*)<\/code>[\r\n\s]*((?!<\w+.*[\/]*>).*|\s*)[\r\n\s]*<\/pre>