正则表达式如何获取数据直到第一次出现?



我现在(<div class="oembed.*)V(.*?)</div>的表达式

https://regexr.com/56l4q

如何在第一"</div>"之前获取数据?因为现在它一直持续到最后一个第 3 个"</div>"

更新#1:

我正在寻找以div 开头的div 中的Vclass="oembed

我想用正则表达式得到的结果:

<div class="oembed  oembed-type-instagram oembed-pre-frame" data-oembed-medialink="https://www.instagram.com/p/B_BEXwtp-V7/" style="margin:10px auto;" data-oembed-url="https://api.instagram.com/oembed/?url=https%3A%2F%2Fwww.instagram.com%2Fp%2FB_BEXwtp-V7&format=json&maxwidth=500&embed=widget&width=1" data-oembed-id="B_BEXwtp-V7" data-oembed-options='{"maxwidth":"500","embed":"widget","width":true}'>1st div</div>

更新#2:

我正在使用这个PHP代码: https://paiza.io/projects/aU_FO4ihErlQngYFy6xvJg

结果是:

'   Vがある<br>
<div id="body-top" class="content-moki clearfix">
Vがある<br>
<span class="headline">
<br>
にモデル「V」を入れると、プレビューでエンベットが崩れる<br>
<br>
<div class="oembed  oembed-type-instagram" data-oembed-medialink="https://www.instagram.com/p/B5mtrL3p3X@CHANGE@/" style="margin:10px auto;max-width: 500px;" data-oembed-url="https://api.instagram.com/oembed/?url=https%3A%2F%2Fwww.instagram.com%2Fp%2FB5mtrL3p3X@CHANGE@&format=json&maxwidth=500&width=1" data-oembed-id="B5mtrL3p3X@CHANGE@" data-oembed-options='{"maxwidth":"500","width":true}'><figure class="moki-embed-instagram"><img src="https://instagram.com/p/B5mtrL3p3X@CHANGE@/media/?size=l"><figcaption><i class="fa fa-instagram icon"></i></figcaption></figure></div>    @CHANGE@がある<br>a </div> @CHANGE@...</div>'

但我必须得到这个结果:

'   Vがある<br>
<div id="body-top" class="content-moki clearfix">
Vがある<br>
<span class="headline">
<br>
にモデル「V」を入れると、プレビューでエンベットが崩れる<br>
<br>
<div class="oembed  oembed-type-instagram" data-oembed-medialink="https://www.instagram.com/p/B5mtrL3p3X@CHANGE@/" style="margin:10px auto;max-width: 500px;" data-oembed-url="https://api.instagram.com/oembed/?url=https%3A%2F%2Fwww.instagram.com%2Fp%2FB5mtrL3p3X@CHANGE@&format=json&maxwidth=500&width=1" data-oembed-id="B5mtrL3p3X@CHANGE@" data-oembed-options='{"maxwidth":"500","width":true}'><figure class="moki-embed-instagram"><img src="https://instagram.com/p/B5mtrL3p3X@CHANGE@/media/?size=l"><figcaption><i class="fa fa-instagram icon"></i></figcaption></figure></div>    Vがある<br>a </div> V...</div>'

你可以在这里看到区别 - https://www.diffchecker.com/n4LIOMtH

Sheesh,我不得不静音 html 警告并跳过一堆 utf-8 箍,让这个 DOM 解析器技术吐出正确的结果,但在这里...... 我确实稍微调整了您的示例 html 并将其全部包装在父div 中以保持稳定性。 我认为这是可以的,因为您的示例字符串看起来像实际文档的片段。

我的 XPath 表达式将在文档中的任意位置搜索包含类oembed<div>,然后搜索其文本以确保它包含目标子字符串 (V(。 如果它找到一个合格的节点,foreach 的主体将看到子字符串已根据需要被替换。

只要您的文档可以被解析,它将是一个更准确/可靠的解决方案,更不用说与正则表达式相比更容易维护 - 这是一个 DOM 无知的工具。

代码:(演示(

$html = <<<HTML
<div>
Vがある<br>
<div id="body-top" class="content-moki clearfix">
Vがある<br>
<span class="headline">
<br>
にモデル「V」を入れると、プレビューでエンベットが崩れる<br>
<br>
<div class="oembed  oembed-type-instagram" data-oembed-medialink="https://www.instagram.com/p/B5mtrL3p3XV/" style="margin:10px auto;max-width: 500px;" data-oembed-url="https://api.instagram.com/oembed/?url=https%3A%2F%2Fwww.instagram.com%2Fp%2FB5mtrL3p3XV&format=json&maxwidth=500&width=1" data-oembed-id="B5mtrL3p3XV" data-oembed-options='{"maxwidth":"500","width":true}'>
<figure class="moki-embed-instagram">
<img src="https://instagram.com/p/B5mtrL3p3XV/media/?size=l">
<figcaption>
<i class="fa fa-instagram icon"></i>
</figcaption>
</figure>
Vがある
</div>
<br>a 
</span>
V...
</div>
</div>
HTML;
$needle = 'V';
$replace = '@CHANGE@';
libxml_use_internal_errors(true);
$dom = new DOMDocument('1.0', 'utf-8'); 
$dom->loadHTML(mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8'), LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
$xpath = new DOMXPath($dom);
foreach ($xpath->query("//div[contains(@class, 'oembed')]/text()[contains(.,'$needle')]") as $node) {
$node->nodeValue = str_replace($needle, $replace, $node->nodeValue);
}
echo $dom->saveXML($dom->documentElement);

输出:(请注意,仅替换目标div 中存在的V(

<div>
Vがある<br/>
<div id="body-top" class="content-moki clearfix">
Vがある<br/>
<span class="headline">
<br/>
にモデル「V」を入れると、プレビューでエンベットが崩れる<br/>
<br/>
<div class="oembed  oembed-type-instagram" data-oembed-medialink="https://www.instagram.com/p/B5mtrL3p3XV/" style="margin:10px auto;max-width: 500px;" data-oembed-url="https://api.instagram.com/oembed/?url=https%3A%2F%2Fwww.instagram.com%2Fp%2FB5mtrL3p3XV&amp;format=json&amp;maxwidth=500&amp;width=1" data-oembed-id="B5mtrL3p3XV" data-oembed-options="{&quot;maxwidth&quot;:&quot;500&quot;,&quot;width&quot;:true}">
<figure class="moki-embed-instagram">
<img src="https://instagram.com/p/B5mtrL3p3XV/media/?size=l"/>
<figcaption>
<i class="fa fa-instagram icon"/>
</figcaption>
</figure>
@CHANGE@がある
</div>
<br/>a 
</span>
V...
</div>
</div>

我会使用类似的东西:

(?:<div class="oembed|G)(?:(?!</div>).)*?KV

演示和解释

法典:

$res = preg_replace('~(?:<div class="oembed|G)(?:(?!</div>).)*?KV~', '@CHANGE@', $text);

相关内容

  • 没有找到相关文章

最新更新