php - 如何在每五次出现另一个字符串后插入字符串?
问题描述
我想使用 PHP 在字符的某个位置插入字符串,所以我有这样的字符串:
$string = "
<p>1</p>
<p>2</p>
<p>3</p>
<p>4</p>
<p>5</p>
<p>6</p>
<p>7</p>
<p>8</p>
<p>9</p>
<p>10</p>
<p>11</p>
<p>12</p>
<p>13</p>
<p>14</p>
<p>15</p>
<p>16</p>
<p>17</p>
";
我想[next]
在每个 5 标签的倍数之后附加这个 bb 代码</p>
,所以它会是这样的:
$string = "
<p>1</p>
<p>2</p>
<p>3</p>
<p>4</p>
<p>5</p>
[next] //appended bb code
<p>6</p>
<p>7</p>
<p>8</p>
<p>9</p>
<p>10</p>
[next] //appended bb code
<p>11</p>
<p>12</p>
<p>13</p>
<p>14</p>
<p>15</p>
[next] //appended bb code
<p>16</p>
<p>17</p>
";
我有一个案例,我有一篇文章需要在第五</p>
,第十</p>
,第十五</p>
等之后进行分页。我尝试的是查找并获取每个位置的数量,并在第十段()时</p>
附加bb 代码。这很好用。[next]
</p>
$string = "
<p>1</p>
<p>2</p>
<p>3</p>
<p>4</p>
<p>5</p>
<p>6</p>
<p>7</p>
<p>8</p>
<p>9</p>
<p>10</p>
<p>11</p>
<p>12</p>
<p>13</p>
<p>14</p>
<p>15</p>
<p>16</p>
<p>17</p>
";
$paginate = '[next]';
$found = 0;
for($i = 1; $i <= 99; $i++) {
$paragraph = strpos($string, "</p>", $found);
$found = $paragraph + 1;
if ($i == 10) {
$string = substr_replace($string, $paginate, $paragraph, 0);
}
}
echo $string;
结果(输出):
1
2
3
4
5
6
7
8
9
10[next]
11
12
13
14
15
16
17
当我尝试每隔 5 个</p>
标签的倍数附加该 bb 代码时,我正在苦苦挣扎,因此非常感谢任何帮助。
解决方案
匹配直到第五个</p>
标签的所有内容,然后用 忘记所有内容\K
,然后注入您的 bbcode。
代码:(演示)
echo preg_replace('~(?:.*?</p>){5}\K~s', "\n [next]", $string);
如果你想要一个标签无知的模式,这里有一个:
~((^|\R).+){5}\K~
或完全尊重您系统的换行符序列:
echo preg_replace('~(?:.+\K\R){5}~', "$0 [next]$0", $string);
推荐阅读
- xml - 当 maven-shade-plugin 最小化 jar 时,如何包含 log4j.xml 中的类?
- c# - Call method in different class from click event method in c#
- user-interface - 如何在 Flutter 中构建带有扩展面板列表的卡片屏幕?
- javascript - the syntax requires an imported helper named __spreadArrays
- python - 在列表中添加项目,直到它们的总和超过阈值
- javascript - 如何制作特定html div的图像或如何在JS中截取特定区域的截图?
- c# - Nunit 测试项目无法加载 System.Windows.Forms 程序集来测试基于 Windows 窗体的应用程序,目标是 .Net 4.6.1
- ios - 无法使用一个信号获取玩家 ID,尝试了此处提供的所有解决方案
- swift - Swift UITextField 目标动作作为闭包,不删除目标动作的问题
- apache-spark - PATINDEX in spark sql