preg_split 最后 2-3 个字符非字母数字

preg_split with last 2-3 characters non alphanumerical

所以我正在研究一些 php,并寻求有关常规 exp 的帮助。

我有一个字符串数组,如下所示:

$variable_with_strings
array(
    [0][art] => >AngusDelu -
    [1][art] => >PatatasJr -
    [2][art] => >AngusHabane *
    [3][art] => >Papas Med *
    [4][art] => >AngusDelu*
    [5][art] => >Papas Med*
    [6][art] => >AngusHabane**
    [7][art] => >Papas Med**
    [8][art] => >Papas Med_*-
    [9][art] => >Manza Med_*-
)

我循环每一个,将其视为单个变量($variable_with_strings

我想将字符串分成两部分以便稍后分组

正在寻找带有 preg_split() 的正则表达式的东西,如下所示: (我需要两个部分;1.-描述项目和 2.- 组标志)

对于我期望的每一个:

$word = array
    [art] => >AngusDelu
    [sep] =>  -)

$word = array(
    [art] => >PatatasJr
    [sep] =>  -)

$word = array(
    [art] => >AngusHabane
    [sep] =>  *)

$word = array(
    [art] => >Papas Med
    [sep] =>  *)

$word = array(
    [art] => >AngusDelu
    [sep] => *)

$word = array(
    [art] => >Papas Med
    [sep] => *)

$word = array(
    [art] => >AngusHabane
    [sep] => **)

$word = array(    
    [art] => >Papas Med
    [sep] => **)

$word = array(
    [art] => >Papas Med
    [sep] => _*-)

$word = array(
    [art] => >Manza Med
    [sep] => _*-)
)

所以我使用了类似的东西:

$word = preg_split('/[^\w]/',$variable_with_strings);

但这会分裂每个白色 space,

我猜这有点棘手,因为在第一个字符中总是有一个 >,最后一个字符是 *_-或者有时 space 在这些 " " 之前,有时特殊字符在末尾出现 1、2 甚至 3。

这样可以吗?

谢谢

我会用

[^a-z]+$

preg_replace 以及 mi 修饰符。 (您的示例没有数字;如果您还需要数字,请在字符 class 中添加 \d

Regex101 演示:https://regex101.com/r/rX3oK7/2(注意演示中的 g 修饰符未在 PHP 中使用,preg_replace 已经是全局的)

PHP 用法:

$string = '[art] => >AngusDelu -
[art] => >PatatasJr -
[art] => >AngusHabane *
[art] => >Papas Med *
[art] => >AngusDelu*
[art] => >Papas Med*
[art] => >AngusHabane**
[art] => >Papas Med**
[art] => >Papas Med--
[art] => >Manza Med--';
echo preg_replace('/[^a-z]+$/im', '', $string);

输出:

[art] => >AngusDelu
[art] => >PatatasJr
[art] => >AngusHabane
[art] => >Papas Med
[art] => >AngusDelu
[art] => >Papas Med
[art] => >AngusHabane
[art] => >Papas Med
[art] => >Papas Med
[art] => >Manza Med

PHP 演示:https://eval.in/479444

您可以使用 preg_split,只匹配字符串的末尾,如 /(\W+$)/,并将 PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE 标志作为第四个参数传递,以捕获您正在分割的任何部分结果。 PREG_SPLIT_DELIM_CAPTURE 捕获您正在拆分的分隔符,PREG_SPLIT_NO_EMPTY 将确保没有空结果。

示例:

<?php
$art = array(
    '>AngusDelu -',
    '>PatatasJr -',
    '>AngusHabane *',
    '>Papas Med *',
    '>AngusDelu*',
    '>Papas Med*',
    '>AngusHabane**',
    '>Papas Med**',
    '>Papas Med--',
    '>Manza Med--',
    );

foreach($art as $a){
    $split = preg_split('/(\W+$)/', $a, -1, PREG_SPLIT_NO_EMPTY|PREG_SPLIT_DELIM_CAPTURE);
    echo '<pre>'.print_r($split,true).'</pre>';
}

演示:http://codepad.viper-7.com/9mCDlc

输出:

Array
(
    [0] => >AngusDelu
    [1] =>  -
)

Array
(
    [0] => >PatatasJr
    [1] =>  -
)

Array
(
    [0] => >AngusHabane
    [1] =>  *
)

Array
(
    [0] => >Papas Med
    [1] =>  *
)

Array
(
    [0] => >AngusDelu
    [1] => *
)

Array
(
    [0] => >Papas Med
    [1] => *
)

Array
(
    [0] => >AngusHabane
    [1] => **
)

Array
(
    [0] => >Papas Med
    [1] => **
)

Array
(
    [0] => >Papas Med
    [1] => --
)

Array
(
    [0] => >Manza Med
    [1] => --
)

每个都在一个单独的数组中,因为你说你有一个数组,所以你需要循环并运行拆分数组中的每个条目。您可以轻松地在循环中一次处理一个数组,或者将它们组合成一个数组以备后用。