什么是获得两个字符串如之间的内容的最好方式
ob_start();
include('externalfile.html'); ## see below
$out = ob_get_contents();
ob_end_clean();
preg_match('/{FINDME}(.|\n*)+{\/FINDME}/',$out,$matches);
$match = $matches[0];
echo $match;
## I have used .|\n* as it needs to check for new lines. Is this correct?
## externalfile.html
{FINDME}
Text Here
{/FINDME}
出于某种原因,这似乎在我的代码一个地方,而不是其他的工作。 我要对这个正确的方式? 或者,还有更好的方法?
也就是输出缓冲区做这做的file_get_contents的方式?
提前致谢!
Answer 1:
- 使用
#
代替/
所以你不要有逃避它们。 - 该修改
s
做.
和\s
还包括换行。 -
{
和}
具有各种功能,例如在从n到m倍{n,m}
基础的
preg_match('#\\{FINDME\\}(.+)\\{/FINDME\\}#s',$out,$matches);
先进的各种标签等(造型不是很好由JavaScript)。
$delimiter = '#'; $startTag = '{FINDME}'; $endTag = '{/FINDME}'; $regex = $delimiter . preg_quote($startTag, $delimiter) . '(.*?)' . preg_quote($endTag, $delimiter) . $delimiter . 's'; preg_match($regex,$out,$matches);
将这个代码的函数
- 对于你不想execue任何杂散 PHP代码的任何文件,你应该使用的file_get_contents。 包括/需要甚至不应该是一种选择那里。
Answer 2:
你不妨使用SUBSTR和strpos这一点。
$startsAt = strpos($out, "{FINDME}") + strlen("{FINDME}");
$endsAt = strpos($out, "{/FINDME}", $startsAt);
$result = substr($out, $startsAt, $endsAt - $startsAt);
你需要添加错误检查来处理它不FINDME的情况。
Answer 3:
我喜欢这两个解决方案
function GetBetween($content,$start,$end)
{
$r = explode($start, $content);
if (isset($r[1])){
$r = explode($end, $r[1]);
return $r[0];
}
return '';
}
function get_string_between($string, $start, $end){
$string = " ".$string;
$ini = strpos($string,$start);
if ($ini == 0) return "";
$ini += strlen($start);
$len = strpos($string,$end,$ini) - $ini;
return substr($string,$ini,$len);
}
我还做了一些基准以及以上两种解决方案并且都给出几乎相同的时间。 您可以也测试它。 我给两个功能的文件读取其中有大约60000个字符(与Word女士的字数审核),并导致约0.000999秒找到两种功能。
$startTime = microtime(true);
GetBetween($str, '<start>', '<end>');
echo "Explodin Function took: ".(microtime(true) - $startTime) . " to finish<br />";
$startTime = microtime(true);
get_string_between($str, '<start>', '<end>');
echo "Subsring Function took: ".(microtime(true) - $startTime) . " to finish<br />";
Answer 4:
换行符会导致正则表达式的问题,尝试删除或\ n处理之前替换它们。
Answer 5:
我喜欢以避免使用正则表达式如果可能的话,这里是替代解决方案中取出两个串之间的所有字符串,返回一个数组。
function getBetween($content, $start, $end) {
$n = explode($start, $content);
$result = Array();
foreach ($n as $val) {
$pos = strpos($val, $end);
if ($pos !== false) {
$result[] = substr($val, 0, $pos);
}
}
return $result;
}
print_r(getBetween("The quick brown {{fox}} jumps over the lazy {{dog}}", "{{", "}}"));
结果:
Array
(
[0] => fox
[1] => dog
)
Answer 6:
function getInbetweenStrings($start, $end, $str){
$matches = array();
$regex = "/$start([a-zA-Z0-9_]*)$end/";
preg_match_all($regex, $str, $matches);
return $matches[1];
}
$str = "C://@@ad_custom_attr1@@/@@upn@@/@@samaccountname@@";
$str_arr = getInbetweenStrings('@@', '@@', $str);
print_r($str_arr);
Answer 7:
这是一个PHP的解决方案,返回大海捞针标签之间找到字符串。 它的工作原理,但我没有效率测试。 我需要这一点,是由亚当·赖特的这个网页上回答启发。
返回包含所有$标签和$ $草堆end_symbold。$标签,或FALSE之间发现的字符串,如果没有$ end_symbol。$标签被发现,因此没有标记对在$草堆存在的阵列()。
function str_between_tags($haystack, $tag, $end_symbol){
$c_end_tags = substr_count($haystack, $end_symbol.$tag);
if(!$c_end_tags) return FALSE;
for($i=0; $i<$c_end_tags; $i++){
$p_s = strpos($haystack, $tag, (($p_e)?$p_e+strlen($end_symbol.$tag):NULL) ) + strlen($tag );
$p_e = strpos($haystack, $end_symbol.$tag, $p_s);
$result[] = substr($haystack, $p_s, $p_e - $p_s);
}
return $result;
}
Answer 8:
快速的方法来把一切都成一个字符串。
$newlines = array("\t","\n","\r","\x20\x20","\0","\x0B");
$one_string = str_replace($newlines, "", html_entity_decode($content));
文章来源: Get content between two strings PHP