PHP通过拆分字符串并中断输出

PHP通过拆分字符串并中断输出,php,tcpdf,Php,Tcpdf,我有一些HTML内容,我需要解析它,得到所有的图像。然后打印出整个内容,但在每次出现图像时都运行一个PHP类实例 This is the content <?php $content = 'Some text <p>A paragraph</p> <img src="image1.jpg" width="200" height="200"> More text <img src="image2.jpg" width="200" height="2

我有一些HTML内容,我需要解析它,得到所有的图像。然后打印出整个内容,但在每次出现图像时都运行一个PHP类实例

This is the content

<?php $content = 'Some text
<p>A paragraph</p>
<img src="image1.jpg" width="200" height="200">
More text
<img src="image2.jpg" width="200" height="200">'; ?>
我需要能够获得图像并使用输出运行一个类方法

所以结果会是这样的

<?php echo 'Some text
<p>A paragraph</p>';

$this->Image('image1.jpg', PDF_MARGIN_LEFT, $y_offset, 116, 85);
echo 'More text';
$this->Image('image2.jpg', PDF_MARGIN_LEFT, $y_offset, 116, 85);

但很明显,我认为它必须是一个循环或自动执行的东西

要将整个HTML片段转换为TcPDF,正如您在评论中提到的,您需要使用每个子节点解析片段并循环,以决定如何适当地处理它们

您在上面提供的代码段的缺点是它不是一个完整的HTML文档,因此DOMDocument在解析它时会将其包装成标签,并在内部加载以下结构:

<html>
    <body>
        Some text
        <p>A paragraph</p>
        <img src="image1.jpg" width="200" height="200">
        More text
        <img src="image2.jpg" width="200" height="200">
    </body>
</html>
下面是regex的实时细分,您可以使用它来了解它的工作原理:

您可以将此正则表达式用于从$content变量中检索所有图像标记,如下所示:

/<img(?:[\s\w="]+)src="([^"]+)"(?:[\s\w="]*)\/?>/i
现在,您可以将$matches循环为$key=>$match,并将$match[1]传递给您的$this->Image方法

或者,如果不想循环,可以直接从$matches访问每个src属性,例如$matches[0][1]、$matches[1][1],等等

如果您需要能够访问标记中的其他属性,那么我建议使用@hakre on提供的DOMDocument方法。如果您只需要访问src属性,那么使用preg_match_all会更快、更高效,因为它不需要将代码段的整个DOM作为对象加载到内存中,以便为您提供所需的数据。

您可以构建一个或来查找图像的位置


你一开始就在寻找两个代币:这个链接可能会帮助你降低投票率,因为你的问题没有显示出任何解决问题的努力——你只是要求我们为你编码。啊哈,我不知道从哪里开始。无论如何@RobertRossmann GAL;太棒了@TwoWholeForms工作得很好,但我仍然需要一种方法,在每次有图像时分解$content,执行Class方法,然后继续输出$content。我知道这看起来很混乱,但不幸的是我正在和TcPDF@PatrickQ马丁:我有点看错问题了。如果您只想获取所有图像源,而不考虑其他信息,那么我给出的答案将起作用。如果要将它们与其余文本交错,则需要在整个块上使用DOMParser,并逐个循环每个节点,以决定如何在循环中处理它们。我马上更新答案。@PatrickQ,Martin:请看更新的答案。这正是我们所需要的。为了弄清楚它,我不得不花了一点时间处理一个测试文件,在这个过程中我自己也学到了一些东西;我通常发现回答问题比问问题能学到更多:
/<img(?:[\s\w="]+)src="([^"]+)"(?:[\s\w="]*)\/?>/i
$matches = array();
$num = preg_match_all('/<img(?:[\s\w="]+)src="([^"]+)"(?:[\s\w="]*)\/?>/i', $content, $matches, PREG_SET_ORDER);
array(
    0 => '<img src="image1.jpg" width="200" height="200">',
    1 => 'image1.jpg',
)
$text = "hello <img src='//first.jpg'> there <img src='//second.jpg'>";
$pos  = 0;

while (($opening = strpos($text, '<img', $pos)) !== FALSE) {

    // Find the next closing bracket's location
    $closing = strpos($text, '>', $opening);
    $length = ($closing - $opening) + 1; // Add one for the closing '>'

    $img_tag = substr($text, $opening, $length);

    var_dump($img_tag);

    // Update the loop position with our closing tag to advance the lexer
    $pos = $closing;
}