2013-02-15 56 views
26

Có chức năng php nào có thể trích xuất cụm từ giữa 2 ký tự khác nhau trong chuỗi không? Một cái gì đó giống như substr();Trích xuất chuỗi con giữa hai ký tự trong một chuỗi PHP

Ví dụ:

$String = [modid=256]; 

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

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

Như vậy $id sẽ là 256

Bất kỳ trợ giúp sẽ được đánh giá cao :)

+1

Bạn có thể làm điều đó trong hai phần: trước tiên quý vị nhận được chuỗi từ $ đầu tiên và sau đó phân tích kết quả cho đến khi ký tự $ thứ hai. – fedorqui

+0

bạn thực sự muốn chụp gì? id, chuỗi, =? – djjjuk

+0

trong trường hợp như vậy tôi thường thích phát nổ các chuỗi của tôi: phát nổ ("=", $ String); và trong bước thứ hai tôi sẽ loại bỏ điều đó "]" có thể thông qua rtrim ($ string, "]"); – tillinberlin

Trả lời

1

Regular Expression là bạn của bạn.

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

Điều này sẽ khớp với bất kỳ số nào, với các giá trị khác bạn sẽ phải điều chỉnh.

1

Bạn có thể sử dụng một biểu thức chính quy:

<?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

(chuyển từ bình luận vì Formating là dễ dàng hơn ở đây)

có thể là một cách tiếp cận lười biếng, nhưng trong trường hợp này tôi lần đầu tiên thường sẽ nổ tung chuỗi của tôi như thế này:

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

và trong một giây bước tôi sẽ thoát khỏi rằng "]" có thể thông qua rtrim:

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

... nhưng điều này sẽ chỉ công việc nếu cấu trúc luôn là giống hệt nhau ...

-cheers-

ps: không nên nó thực sự là $ String = "[modid = 256]";?

0

Hãy thử Regular Expression

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

Output

Array ([0] => 256)

DEMO

Giải thích đây sử dụng cái nhìn tích cực phía sau (? < =) trong biểu thức chính quy ví dụ: (? < = foo) thanh khớp với thanh trước foo, tại đây (?< = (=)) (\ d +) chúng tôi khớp (\ d +) ngay sau ký hiệu '='. \ d Khớp với bất kỳ ký tự chữ số nào (0-9). + Trận 1 hoặc nhiều preceeding thẻ

+0

Tại sao bạn đã sử dụng biến kết quả $? –

-1

Bạn có thể sử dụng một biểu thức chính quy hoặc bạn có thể thử điều này:

$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 
} 

Bạn nên đọc về substr. Cách tốt nhất cho việc này là biểu thức chính quy.

2

Nếu bạn không muốn sử dụng expresion reqular, sử dụng strstr, trimstrrev chức năng:

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

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

Sử dụng:

<?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)); 
} 

?> 
Các vấn đề liên quan