2014-02-12 151 views
0

之間PHP的preg_match獲取內容

<!--:en-->Apvalus šviestuvas<!--:--> 
<!--:ru-->Круглый Светильник<!--:--> 
<!--:lt-->Round lighting<!--:--> 
我需要獲取內容 <!--:lt--><!--:-->

之間我曾嘗試:

$string = "<!--:en-->Apvalus šviestuvas<!--:--><!--:ru-->Круглый Светильник<!--:--><!--:lt-->Round lighting<!--:-->"; 
preg_match('<!--:lt-->+[a-zA-Z0-9]+<!--:-->$', $string, $match); 

var_dump($match); 

有些事情錯的語法和邏輯。我該如何做這項工作?

+0

首先你要逃跑元字符( - !) – hindmost

+1

@hindmost':!'和''不是元字符,'-'不是元字符,除非它在'[]'內。至少不在POSIX中。 – Halcyon

+0

我的意思是「保留」字符。一般情況下':'和'!'應該被轉義以避免不正確的解釋。 – hindmost

回答

2
preg_match("/<!--:lt-->([a-zA-Z0-9 ]+?)<!--:-->/", $string, $match); 
  • 添加分隔符
  • 加入比賽羣
  • 添加?,使之ungreedy
  • 加入[space](存在Round lighting空格)

你的結果應該是在$match[1]


冷卻器和更通用的變化是:

preg_match_all("/<!--:([a-z]+)-->([^<]+)<!--:-->/", $string, $match); 

將匹配所有的人。得出:

array(3) { [0]=> array(3) { [0]=> string(37) "Apvalus šviestuvas" [1]=> string(53) "Круглый Светильник" [2]=> string(32) "Round lighting" } [1]=> array(3) { [0]=> string(2) "en" [1]=> string(2) "ru" [2]=> string(2) "lt" } [2]=> array(3) { [0]=> string(19) "Apvalus šviestuvas" [1]=> string(35) "Круглый Светильник" [2]=> string(14) "Round lighting" } } 
+2

由於下一個字符不在字符類內部,因此不需要使用惰性量詞。 –

0

使用這種模式(?<=<!--:lt-->)(.*)(?=<!--:-->)

<?php 
$string = "<!--:en-->Apvalus šviestuvas<!--:--><!--:ru-->Круглый Светильник<!--:--><!--:lt-->Round lighting<!--:-->"; 
preg_match('~(?<=<!--:lt-->)(.*)(?=<!--:-->)~', $string, $match); 

var_dump($match);