Как регуляркой вырезать обрамленный слова в массив?

sanu0074

Новичок
Есть строка "#слово17#блабла бла #слово# блабла бла #слово56# блабла бла #слово77# "
Нужно все слова что находятся между символами # #, вырезать в отдельный массив с помощью регулярки.
Я это сделал перебором строки:
PHP:
$str = "#слово17#блабла бла #слово# блабла бла #слово56# блабла бла #слово77# ";
$words = array();
$j = 0;
$anchor = FALSE;
for($i=0;$i<strlen($str);$i++){
    if($str[$i]=="#"){
        if(!$anchor){
            $anchor = TRUE;
            $words[$j] = "";
            continue;
        }else {
            $anchor = FALSE;
            $j++;
            continue;
        }
    }
    if($anchor){
        $words[$j] .= $str[$i];
    }
}
print_r($words);
но думаю регулярка более подходящий вариант...
 

sanu0074

Новичок
sanu0074, так, погоди, я не так тебя понял видимо. Тебе надо вырезать все, что находится между # и не имеет пробелов ни до #, ни после #? То есть #слова#?
пофиг на пробелы, можеш запустить тот код что в шапке темы, он делает как надо. вырезать нужно все что находится между решетками, только регуляркой
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
sanu0074, запустить я могу, я просто не так тебя понял, извиняй

PS: я далеко не гуру регулярок, но мне кажется как-то так /#([0-9а-яё]+)#/iu
 
Последнее редактирование:

AnrDaemon

Продвинутый новичок
Если литерально переводить код в регэксп,
Код:
/#([^#]+)#/u
А если нет, то давай формальное описание разбора строки.
 

AnrDaemon

Продвинутый новичок
только регуляркой? эксполд не вариант?
Можно конечно сделать эксплод и взять каждый второй чанк… но как ты угадаешь, с какого начать считать?
Перед эксплодом поискать позицию первого разделителя?
 

Активист

Активист
Команда форума
PHP:
<?php 
$str = "#слово17#блабла бла #слово# блабла бла #слово56# блабла бла #слово77# ";
preg_match_all("/#.+?#/", $str, $matchs);

var_dump($matchs);
?>
 

AnrDaemon

Продвинутый новичок
Так не дольше работать будет?
И я подумал тут, что надо таки писать
Код:
/#([^#]*)#/u
.
Ибо условия, что секция непустая, судя по коду, не стоит.
 

Активист

Активист
Команда форума
Так не дольше работать будет?
И я подумал тут, что надо таки писать
Код:
/#([^#]*)#/u
.
Ибо условия, что секция непустая, судя по коду, не стоит.
Я для себя модификатор (или как его там) жадности открыл :) Красиво!! Ну и по вашему вопросу:
PHP:
preg_match_all("/#.*?#/", $str, $matchs);
 

AnrDaemon

Продвинутый новичок
Я знаю про этот модификатор. Просто у меня почему-то в затылке бьётся мысль, что ".*?#" будет работать медленнее, чем "[^#]*".
Есть мысли, как это померять?
 
Последнее редактирование:

AnrDaemon

Продвинутый новичок
Да погадать и я могу. Мне интересно, как померять :)
 
Сверху