2013-02-15 2 views
26

Есть ли функция php, которая может извлекать фразу между двумя разными символами в строке? Что-то вроде substr();Извлечь подстроку между двумя символами в строке PHP

Пример:

$String = [modid=256]; 

$First = "="; 
$Second = "]"; 

$id = substr($string, $First, $Second); 

Таким образом $id будет 256

Любая помощь будет оценена :)

+1

Вы можете сделать это на две части: во-первых, вы получите строку от $ first, а затем проанализировать результат до символа $ second. – fedorqui

+0

что вы на самом деле хотите захватить? id, строка, =? – djjjuk

+0

В таких случаях я обычно люблю взрывать мои строки: explode ("=", $ String); и на втором этапе я бы избавился от этого "]" возможно через rtrim ($ string, "]"); – tillinberlin

ответ

1

Regular Expression является вашим другом.

preg_match("/=(\d+)\]/", $String, $matches); 
var_dump($matches); 

Это будет соответствовать любому числу, для других значений вам придется его адаптировать.

1

Вы можете использовать регулярное выражение:

<?php 
$string = "[modid=256][modid=345]"; 
preg_match_all("/\[modid=([0-9]+)\]/", $string, $matches); 

$modids = $matches[1]; 

foreach($modids as $modid) 
    echo "$modid\n"; 

http://eval.in/9913

2
$String = "[modid=256]"; 

$First = "="; 
$Second = "]"; 

$Firstpos=strpos($String, $First); 
$Secondpos=strpos($String, $Second); 

$id = substr($String , $Firstpos, $Secondpos); 
1
$str = "[modid=256]"; 
preg_match('/\[modid=(?P<modId>\d+)\]/', $str, $matches); 

echo $matches['modId']; 
0

(прокачивает от комментариев, потому что верстка легче здесь)

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

$string_array = explode("=",$String); 

и в секунде шаг я бы избавиться от этого «]», может быть, через RTRIM:

$id = rtrim($string_array[1], "]"); 

... но это будет только работа, если структура всегда точно такой же ...

-cheers-

пс: она не должна быть на самом деле $ String = "[modid = 256]";?

0

Попробуйте регулярное выражение

$String =" [modid=256]"; 
$result=preg_match_all('/(?<=(=))(\d+)/',$String,$matches); 
print_r($matches[0]); 

Выходной

Array ([0] => 256)

DEMO

Объяснение Здесь его использовал «Положительный взгляд» (? < =) в регулярном выражении eg (? < = foo) bar bar bar, когда ему предшествует foo, здесь (?< = (=)) (\ d +) мы сопоставляем (\ d +) сразу после знака '='. \ d Соответствует любому символу цифры (0-9). + Матчи 1 или более предшествующих лексемы

+0

Почему вы использовали переменную $ result? –

-1

Вы можете использовать регулярное выражение, или вы можете попробовать это:

$String = "[modid=256]"; 

$First = "="; 
$Second = "]"; 
$posFirst = strpos($String, $First); //Only return first match 
$posSecond = strpos($String, $Second); //Only return first match 

if($posFirst !== false && $posSecond !== false && $posFirst < $posSecond){ 
    $id = substr($string, $First, $Second); 
}else{ 
//Not match $First or $Second 
} 

Вы должны прочитать о подстроке. Лучшим способом для этого является регулярное выражение.

2

Если вы не хотите использовать reqular expresion, используйте strstr, trim и strrev функции:

// Require PHP 5.3 and higher 
$id = trim(strstr(strstr($String, '='), ']', true), '=]'); 

// Any PHP version 
$id = trim(strrev(strstr(strrev((strstr($String, '='))), ']')), '=]'); 
19

Использование:

<?php 

$str = "[modid=256]"; 
$from = "="; 
$to = "]"; 

echo getStringBetween($str,$from,$to); 

function getStringBetween($str,$from,$to) 
{ 
    $sub = substr($str, strpos($str,$from)+strlen($from),strlen($str)); 
    return substr($sub,0,strpos($sub,$to)); 
} 

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