2012-02-14 3 views
3

Рассмотрите следующее. Я разделив строку на {} теги, которые фигурные скобки с anynumber символов (и/или цифр) между ними:Разделите строку на теги, удалите пустой результат

$string = "Lorem {FOO} ipsum {BAR} dolor {FOO:bar} samet"; 
$temp = preg_split('/(\{.*?\})/', $string, -1, PREG_SPLIT_DELIM_CAPTURE); 

Результирующий массив ($ TEMP) является:

Array (
    [0] => Lorem [1] => {FOO} [2] => ipsum [3] => {BAR} 
    [4] => dolor [5] => {FOO:bar} [6] => samet 
) 

Однако, если $ строка заканчивается с меткой, например:

$string = "Lorem {FOO} ipsum {BAR} dolor {FOO:bar}"; 

Затем результирующий массив ($ Temp) содержит пустой элемент (# 6 в данном случае):

Array (
    [0] => Lorem [1] => {FOO} [2] => ipsum [3] => {BAR} 
    [4] => dolor [5] => {FOO:bar} [6] => 
) 

Очевидно, что это может быть впоследствии удалено путем проверки пустых значений, но, на мой взгляд, это не самый элегантный способ. Есть ли альтернатива (по регулярному выражению, возможно?), Чтобы не иметь пустых элементов в результирующем массиве для начала?

ответ

3

Да использовать флаг PREG_SPLIT_NO_EMPTY как это:

$string = "Lorem {FOO} ipsum {BAR} dolor {FOO:bar}"; 
$arr = preg_split('/(\{.*?\})/', $string, 0, 
        PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY); 
print_r($arr); 

ВЫВОД:

Array 
(
    [0] => Lorem 
    [1] => {FOO} 
    [2] => ipsum 
    [3] => {BAR} 
    [4] => dolor 
    [5] => {FOO:bar} 
) 
2

Ваше текущее выражение /(\{.*?\})/ может быть изменено без разделения, если split-pattern является последним элементом строки. /(\{.*?\})(?!$)/ использует negative look ahead assertion ((?!…)), чтобы убедиться, что ваш шаблон соответствует только, если за ним не следует EOL ($). Но теперь шаблон уже не распознается, что приводит к последнему элементу перед тем, как шаблон и шаблон не будут разделены. Что вы остались с:

array(5) { 
    "Lorem " 
    "{FOO}" 
    " ipsum " 
    "{BAR}" 
    " dolor {FOO:bar}" 
} 

очевидно не то, что вы хотите. Первое, что приходит на ум, - проверить, пуст ли первый и последний элементы результата разделения. если да, удалите их. может быть, как это:

<?php 

$string = "{FOO} ipsum {BAR} dolor {FOO:bar}"; 
$temp = preg_split('/(\{.*?\})/', $string, -1, PREG_SPLIT_DELIM_CAPTURE); 
$i = 0; 
if (isset($temp[$i]) && $temp[$i] === '') { 
    array_shift($temp); 
} 
$i = count($temp) -1; 
if (isset($temp[$i]) && $temp[$i] === '') { 
    array_pop($temp); 
} 

var_dump($temp); 
+0

Выход этого выражения: Array ([0] => Lorem [1] => {FOO} [2] => ipsum [3] => {BAR} [4] => dolor {FOO: bar}) - с обоими «долорами» и {FOO: bar} в финале элемент массива. Я ищу: Array ([0] => Lorem [1] => {FOO} [2] => ipsum [3] => {BAR} [4] => dolor [5] => { FOO: bar}) с {FOO: bar} самостоятельно в конечном элементе. Это то, что вы пытались сделать, или я не понял ваш комментарий правильно? – Pr0no

+1

Я преждевременно ударил кнопку сохранения, извините за это. Посмотрите полный ответ сейчас ... – rodneyrehm

Смежные вопросы