preg_match 仅返回相同元素一次

发布于 2024-11-28 02:55:25 字数 269 浏览 0 评论 0原文

我正在遍历一个字符串并处理 !-- 和 --! 之间的所有元素。但只有独特的元素才是过程。当我有!--例子--!在文本中还有一点!--example--!,第二个被忽略。

这是代码:

while ($do = preg_match("/!--(.*?)--!/", $formtext, $matches)){

我知道 preg_match_all,但需要使用 preg_match 来完成此操作。

有什么帮助吗?提前致谢!

I am going through a string and proces all the elements between !-- and --!. But only unique elements are processes. When I have !--example--! and a bit further in the text also !--example--!, the second one is ignored.

This is the code:

while ($do = preg_match("/!--(.*?)--!/", $formtext, $matches)){

I know about preg_match_all, but need to do this with preg_match.

Any help? Thanks in advance!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

好倦 2024-12-05 02:55:25

您将希望 PHP 仅在上一个匹配之后查找匹配。为此,您需要使用 PREG_OFFSET_CAPTURE 标志捕获字符串偏移量。

示例:

$offset = 0;
while (preg_match("/!--(.*?)--!/", $formtext, $match, PREG_OFFSET_CAPTURE, $offset))
{
    // calculate next offset
    $offset = $match[0][1] + strlen($match[0][0]);

    // the parenthesis text is accessed like this:
    $paren = $match[1][0];
}

有关详细信息,请参阅 preg_match 文档。

You'll want PHP to look for matches only after the previous match. For that, you'll need to capture string offsets using the PREG_OFFSET_CAPTURE flag.

Example:

$offset = 0;
while (preg_match("/!--(.*?)--!/", $formtext, $match, PREG_OFFSET_CAPTURE, $offset))
{
    // calculate next offset
    $offset = $match[0][1] + strlen($match[0][0]);

    // the parenthesis text is accessed like this:
    $paren = $match[1][0];
}

See the preg_match documentation for more info.

肤浅与狂妄 2024-12-05 02:55:25

使用 preg_match_all

编辑:一些澄清:

$string = '!--example--!   asdasd !--example--!';
//either this:
$array = preg_split("/!--(.*?)--!/",$string,-1,PREG_SPLIT_DELIM_CAPTURE);
var_dump($array);
array(5) {
  [0]=>
  string(0) ""
  [1]=>
  string(7) "example"
  [2]=>
  string(10) "   asdasd "
  [3]=>
  string(7) "example"
  [4]=>
  string(0) ""
}

//or this:
$array = preg_split("/(!--(.*?)--!)/",$string,-1,PREG_SPLIT_DELIM_CAPTURE);
var_dump($array);

array(7) {
  [0]=>
  string(0) ""
  [1]=>
  string(13) "!--example--!"
  [2]=>
  string(7) "example"
  [3]=>
  string(10) "   asdasd "
  [4]=>
  string(13) "!--example--!"
  [5]=>
  string(7) "example"
  [6]=>
  string(0) ""
}

Use preg_match_all

edit: some clarification yields:

$string = '!--example--!   asdasd !--example--!';
//either this:
$array = preg_split("/!--(.*?)--!/",$string,-1,PREG_SPLIT_DELIM_CAPTURE);
var_dump($array);
array(5) {
  [0]=>
  string(0) ""
  [1]=>
  string(7) "example"
  [2]=>
  string(10) "   asdasd "
  [3]=>
  string(7) "example"
  [4]=>
  string(0) ""
}

//or this:
$array = preg_split("/(!--(.*?)--!)/",$string,-1,PREG_SPLIT_DELIM_CAPTURE);
var_dump($array);

array(7) {
  [0]=>
  string(0) ""
  [1]=>
  string(13) "!--example--!"
  [2]=>
  string(7) "example"
  [3]=>
  string(10) "   asdasd "
  [4]=>
  string(13) "!--example--!"
  [5]=>
  string(7) "example"
  [6]=>
  string(0) ""
}
淤浪 2024-12-05 02:55:25

while ($do = preg_match("/[!--(.*?)--!]*/", $formtext, $matches)){

指定模式末尾的 *指定多个。它们都应该添加到您的 $matches 数组中。

while ($do = preg_match("/[!--(.*?)--!]*/", $formtext, $matches)){

Specify the * at the end of the pattern to specify more than one. They should both get added to your $matches array.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文