如何在PREG_MATCH_ALL参数中使用变量作为类名称?

时间:2020-01-11 作者:Ashur

我使用正则表达式来获取单个p标记内的文本,该标记以其类为目标。问题是我想使用一个php变量作为类名,并使用循环每次更改类名。

$sample = get_the_content(); 


<button class="accordion">
preg_match(\'/<strong class="1">(.*?)<\\/strong>/s\', $sample, $match); 
echo $match[1]; 


$className = "1";
我想使用上面的$classname变量,并在循环中递增它,以每次获得不同的段落内容。

我希望我的问题清楚。

3 个回复
SO网友:Adam

注意:这个问题与WordPress无关,而是直接与PHP相关,应该在StackOverflow 但我在下面提供了一个非常基本的答案,以帮助您实现目标。然而,请注意这个答案is not necessarily the best way 去解决你的问题,nor is it meant to be efficient.

// assuming get_the_content() equates to ↓

$content = \'<p class="1">P1 Content</p><p class="2">P2 Content</p><p class="3">P3 Content</p>\';

$classNames = [\'1\', \'2\', \'3\'];

$matches = [];

foreach( $classNames as $className ) {

    $pattern = sprintf(\'\\<p\\sclass=\\"%s\\"\\>(.*?)\\<\\/p\\>\', $className);

    preg_match("/{$pattern}/i", $content, $found); 

    $matches[] = $found;

}

var_dump($matches);

/*
array(3) {
  [0]=>
  array(2) {
    [0]=>
    string(27) "<p class="1">P1 Content</p>"
    [1]=>
    string(10) "P1 Content"
  }
  [1]=>
  array(2) {
    [0]=>
    string(27) "<p class="2">P2 Content</p>"
    [1]=>
    string(10) "P2 Content"
  }
  [2]=>
  array(2) {
    [0]=>
    string(27) "<p class="3">P3 Content</p>"
    [1]=>
    string(10) "P3 Content"
  }
}
*/

更新1:

如果没有固定的已知类名列表(提前),请使用以下示例preg_match_all 并寻找任何<P> 标记为class = NUMBER.

<p class="1">Content</p>
<p class="2">Content</p>
<!-- etc.. -->
<p class="234">Content</p>
$content = \'<p class="1">P1 Content</p><p class="2">P2 Content</p><p class="3">P3 Content</p>\';

$pattern = sprintf(\'\\<p\\sclass=\\"%s\\"\\>(.*?)\\<\\/p\\>\', \'[0-9]+\');

var_dump($pattern);

preg_match_all("/{$pattern}/i", $content, $found);

var_dump($found);

/*
array(2) {
  [0]=>
  array(3) {
    [0]=>
    string(27) "<p class="1">P1 Content</p>"
    [1]=>
    string(27) "<p class="2">P2 Content</p>"
    [2]=>
    string(27) "<p class="3">P3 Content</p>"
  }
  [1]=>
  array(3) {
    [0]=>
    string(10) "P1 Content"
    [1]=>
    string(10) "P2 Content"
    [2]=>
    string(10) "P3 Content"
  }
}
*/
/**
 * Iterate over the results (if any) and do something with the content.
 */
if ( is_array($found) && isset($found[1]) ) {

    foreach( $found[1] as $content ) {

        echo $content;

    }

}
结果如下:

P1 Content
P2 Content
P3 Content
我建议您在类名前加前缀,例如:

<p class="myprefix-1">Content</p>
<p class="myprefix-2">Content</p>
<!-- etc.. -->
<p class="myprefix-234">Content</p>
如果是,请确保更新您的regex模式:

$pattern = sprintf(\'\\<p\\sclass=\\"myprefix-%s\\"\\>(.*?)\\<\\/p\\>\', \'[0-9]+\');

REPL.IT DEMO

SO网友:Ashur

我找到了问题的解决方案,我想与大家分享:

为此,我只创建了一个php变量,并在参数中间添加了:

$sample = get_the_content(); 

$classes = \'1\';
<button class="accordion">
preg_match(\'/<p class="\'.$classes.\'">(.*?)<\\/p>/s\', $sample, $match); 
echo $match[1];
我仍然不知道如何每次增加1个类来获得不同的内容。

SO网友:Ashur

亲爱的“Adam”,这是我正在尝试做的,但我在数组长度上有问题。

$tkey = \'post-update\';

$update = new WP_Query(array(
    \'posts_per_page\' => -1,
    \'tag\' => $tkey
));

wp_reset_postdata();

if ($update->have_posts()) {
    while ($update->have_posts()) {
        $update->the_post();
        $sample = get_the_content();
    }
}

$classes = array();
array_push($classes, $match);

foreach ($classes as $names => $text) {

?>
    <button class="accordion">
        <?php
        preg_match(\'/<strong class="\' . $text . \'">(.*?)<\\/strong>/s\', $sample, $match);
        echo $match[1];
        ?>
    </button>
    <div class="panel">
        <p>
            <?php
            preg_match(\'/<p class="\' . $text . \'">(.*?)<\\/p>/s\', $sample, $match);
            echo $match[1];
            ?>
        </p>
    </div>
<?php } ?>
</div>

相关推荐

从帖子内容中提取信息(使用regex?)

在保存帖子之前,我正在尝试替换内容中的一些自定义字符串。我得到了$data[“post\\u content”],其中包括像%replaceContent:{type}这样的字符串。现在我需要提取该字符串,读取{type},然后根据{type}的内部内容替换该字符串。我想这最好用regex来完成,不幸的是我真的不知道该怎么做。想法?