首页 > 解决方案 > 如何通过php将样式应用于字符串中包含的经文段落中的经文编号?

问题描述

我需要找到一种方法来识别经文段落中的经文编号,以便我可以将样式应用于它们(即颜色和上标)。我正在使用 php 并从 MySQL 数据库中提取段落。下面是我在关于我们页面上使用的一个小代码片段。

<span>What is your favorite passage in the bible? </span><?php echo $row[ "verse" ]; ?><br><?php echo $row[ "scripture" ]; ?>

verse包含类似的东西Jeremiah 22:15-16scripture包含类似的东西

15但美丽的香柏木宫殿不能造就伟大的国王!你的父亲约西亚也有很多吃的和喝的。但他在所有的交易中都是公正和正确的。这就是上帝赐福给他的原因。16 他伸张正义,扶助穷人和穷人,一切都顺利。这不就是认识我的意思吗?” 主说。

我希望能够分析任何字符串,并在将字符串回显到页面之前<span class="verse">,在经文编号之前和之后应用 a。</span>这样,输出看起来更像是这样的:

15但美丽的香柏木宫殿不能造就伟大的国王!你的父亲约西亚也有很多吃的和喝的。但他在所有的交易中都是公正和正确的。这就是上帝赐福给他的原因。16他为穷人和有需要的人伸张正义,帮助他,一切都很顺利。这不就是认识我的意思吗?” 主说。

<span class="verse">15</span>But a beautiful cedar palace does not make a great king! Your father, Josiah, also had plenty to eat and drink. But he was just and right in all his dealings. That is why God blessed him. <span class="verse">16</span>He gave justice and help to the poor and needy, and everything went well for him. Isn’t that what it means to know me?” says the Lord.

我一直无法在网上找到解决方案。我可以找到如何在字符串中搜索某个字符或子字符串,但不能找到如何在字符串中查找任何数字。我非常感谢您能提供的任何帮助。

标签: phphtml

解决方案


感谢@TemaniAfif 引导我朝着正确的方向前进,我能够找到解决方案。使用preg_match_all()在字符串中搜索模式可以让我找到字符串中的经文编号,并将它们替换为每个经文编号之前和之后。该preg_match_all()函数匹配字符串中所有出现的模式。

执行我的 sql 查询后,我运行了以下代码:

<?php
while ( $row = $query->fetch_assoc() ) {
        $pattern = "/\d+/";
        $passage = $row[ "scripture" ];
        preg_match_all( $pattern, $passage, $matches, PREG_PATTERN_ORDER );
        foreach ( $matches[0] as $match ) {
            $passage = str_replace( $match, "<sup class='verse'>" . $match . "</sup>", $passage );
        }
    ?>
    <p>
        <span><?php echo $row[ "verse" ]; ?></span><br><?php echo $passage; ?><br>
    </p>
<?php } ?>

$pattern定义我们试图在字符串中查找的字符串。在这种情况下,/\d+/匹配字符串中任意数量的任意大小。它可以是一位或多位数字。如果我们只想匹配 1 位数字的经文,我们将删除+.

$passage只是我们正在搜索的输入字符串。在这种情况下,它是 SQL 表中的一行。

$matches是 preg_match_all() 将返回它发现的任何匹配项的多维数组的名称。

PREG_PATTERN_ORDER是一个标志,实际上不需要在那里,因为它是默认选项。PREG_PATTERN_ORDER排序结果,因此它$matches[0]是一个完整模式匹配的数组,$matches[1]是一个由第一个带括号的子模式匹配的字符串数组,依此类推。

因为我们只关心模式匹配,所以我们foreach()通过访问 $matches[0] 数组来循环遍历它们。在 中,foreach()我们通过在每个匹配项<sup class='verse'>之前和之后放置来替换字符串中的匹配项。</sup>str_replace()

的第一个参数str_replace()是我们的匹配。第二个是我们要替换匹配的内容。最后一个参数是主题,在我们的例子中是字符串。

我希望这可以帮助其他尝试完成相同或类似事情的人。

php.net preg_match_all() 文档 php.net str_replace() 文档


推荐阅读