我现在(<div class="oembed.*)V(.*?)</div>
的表达式
https://regexr.com/56l4q
如何在第一"</div>"
之前获取数据?因为现在它一直持续到最后一个第 3 个"</div>"
更新#1:
我正在寻找以div 开头的div 中的V
class="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&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"/>
</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);