这可能是一种奇怪的解决问题的方法,但我们可以使用正则表达式来解决它,就像你的标题一样。
如果我们有这样的字符串:
$string = '
[ITEM 1]
defname itemname
name just name
id 953124
value 52235
color red
[ITEM 2]
value 522
name hi
id 5335
color yellow
defname thats 2 ';
我们可以使用preg_replace_callback,它将提取字符串的每一行并将其发送到我们选择的函数进行处理。在这里,我说让我将ITEM 1 的每个部分作为自己的行并将其发送到名为reorder_function 的函数。
我已在表达式上方标记了每个部分,以便您查看它的匹配位置。然后,我简单地打印出新转换的字符串。
// MATCH THE PATTERNS, RUN THE MATCHES THROUGH THE 'reorder_function' FUNCTION AND SAVE THE RESULTS
// 1 2 3 4 5 6
$string = preg_replace_callback('~(\[ITEM \d+\]).*?\n(.*?)\n(.*?)\n(.*?)\n(.*?)\n(.*?)($|\n)~', 'reorder_function', $string);
// PRINT OUT THE RESULTS
print $string;
reorder_function 函数看起来有点吓人,但它真的没那么糟糕。大多数情况下,我有很多 cmets 占用空间。它基本上循环遍历包含您希望每个项目的顺序的数组,并且在执行此操作时,它会检查每个匹配项以查看它是否匹配“ID”、“颜色”等。当它找到匹配项时,它会将其写入数组中的特定位置。一旦所有的位置都被填满,数组就会变成一个字符串,[ITEM 1] 的内容会被我们函数的输出覆盖。然后它转到[ITEM 2] 并重复该过程。
// FUNCTION THAT WILL TAKE THE MATCHES AND ORDER THEM APPROPRIATELY
function reorder_function($m) {
// SET THE DEFAULTS
$order_array = array( 1 => 'ID', 2 => 'Color', 3 => 'Defname', 4 => 'Name', 5 => 'Value' );
$final_output_array = array($m[1]); // DEFINE AN ARRAY AND SET THE [ITEM X] TO THE FIRST VALUE
// LOOP THROUGH THE ORDER ARRAY
foreach ($order_array AS $key => $val) {
// LOOP THROUGH THE MATCHES THAT HAVE BEEN FOUND
foreach ($m AS $match_key => $match_val) {
// IF THE MATCH FINDS "ID", THEN IT WILL ASSIGN THE VALUE AT POSITION "1"
// FOR EACH ONE, IT WILL ASSIGN THE VALUE UNTIL WE ARE OUT OF VALUES TO TEST
if (preg_match('~^\s*'.$val.'\s~i', $match_val)) {
$final_output_array[$key] = $match_val;
}
}
}
// TURN THE ARRAY INTO A STRING AND SEND IT BACK TO THE preg_replace_callback FUNCTION
return implode("\n", $final_output_array)."\n";
}
当一切都说完了,我们得到了这个:
[ITEM 1]
id 953124
color red
defname itemname
name just name
value 52235
[ITEM 2]
id 5335
color yellow
defname thats 2
name hi
value 522
这是一个工作演示:
http://ideone.com/JtYZlx