2012-01-16 3 views
1

Я использую это с успехомphp substr - как найти <br> перед запуском substr?

$str = "{source}do_something"; 
if(substr($str, 0, 8) == "{source}") 

но что я должен делать, если я

$str = "<br><br>{source}do_something"; 

цель состоит в том, чтобы иметь возможность добавлять пустые строки (столько, сколько необходимо) перед обжигом мой do_something

Благодаря

EDIT

нормально, так что мне нужно, чтобы запустить функцию

меню, вертикальная, истинная

, но мне также нужно, чтобы эти пустые строки перед моим меню

моя строка

<br><br><br><div>{source}_menu_;vertical,true{/source}</div> 

без разрывов строк Использую

if(substr($pos, 0, 8) == "{source}") { 
    $campos = substr_replace($description, '', 0, 8); 
    $campos = substr($campos, 0, -9); 
    $funcao = explode(";", $campos); 
    call_user_func_array($funcao[0], array($funcao[1])); 
} 

теперь мне нужно то же самое, но с разрывами строк, поэтому браузер фактически отображает разрывы строк, а затем запускает функцию.

Я надеюсь, что мой английский достаточно хорошо, чтобы сделать это ясно ...

Благодаря

правка раствором

$startTag = "{source}"; 
$endTag = "{/source}"; 
$initial_strpos = strpos($str, $startTag); 
$final_strpos = strpos($str, $endTag); 
if ($initial_strpos !== false) { 
    $beforeTag = substr($str, 0, $initial_strpos); 
    echo htmlspecialchars_decode($beforeTag, ENT_QUOTES); 
    $start = $initial_strpos + strlen($startTag); 
    $innerText = substr($str, $start, strpos($str, $endTag)-$start); 
    $funcao = explode(";", $innerText); 
    call_user_func_array(array_shift($funcao), $funcao); 
    $aferTag = strpos($str, $final_strpos); 
    echo htmlspecialchars_decode($aferTag, ENT_QUOTES); 
} 

это будет печатать мои разрывы строк и запустить свою функцию ,

+2

Вы можете сравнить строку после запуска 'strip_tags()' на ней - если это работает для вас. Не совсем ясно, какова конечная цель: –

+0

Вы пытаетесь извлечь строку между фигурными скобками '{' и '}'? – anubhava

+0

точно, моя цель - запустить функцию, имя которой находится внутри {source}, например


{source}_menu_;vertical,true{/source}
Pluda

ответ

1

Если вы должны проверить первые 8 символов конкретно, то вы должны удалить <br> S из строки перед выполнением подстроки:

if (substr(str_replace("<br>", "", $str), 0, 8) == "{source}") 

Это не будет работать, если строка немного отличается, т.е. <br /> ,Лучший способ сделать это, вероятно, будет:

if (strpos($str, "{source}") !== false) 

EDIT

Как насчет этого? Он должен получить текст между тегами {source}{/source} и разделить их на ;, затем взять первую запись как имя функции, а вторую - как функцию функции.

$startTag = "{source}"; 
$endTag = "{/source}"; 
$strpos = strpos($str, $startTag); 
if ($strpos !== false) 
{ 
    $start = $strpos + strlen($startTag); 
    $innerText = substr($str, $start, strpos($str, $endTag)-$start); 
    list($functionName, $parameters) = explode(";", $innerText); 
    call_user_func_array($functionName, explode(",", $parameters)); 
} 
+0

Я редактирую свой вопрос – Pluda

+0

нормально, ваш ответ почти правильный или правильный, но ему не хватает initial_strpos и final_strpos, поэтому мы можем распечатать что-то раньше, функцию и что после , Я собираюсь пересмотреть свой вопрос, чтобы сделать это доступным для всех. благодаря – Pluda

2

Вы можете попробовать использовать strrpos:

$pos = strrpos($str, "{source}"); 
if ($pos === false) { // note: three equal signs 
    // not found... 
} else { 
    // found 
} 

EDITED после нового комментария:
Вы могли бы попробовать что-то вроде:

$from = 1 + stripos($str, "{"); 
$to = stripos($str, "}", $from) - 1; 
$your_string = substr($str, $from, $end - $from + 1); 

Естественно, вы должны проверить, что обоих индексов ($from и $to), но этот пример должен дать вам идею ...

+0

@Pluda: Я просмотрел ваш комментарий и отредактировал свой ответ. Надеюсь, это поможет ... – Marco

+0

Спасибо, я только что отредактировал мой вопрос – Pluda