XPath的.语法代表当前节点吗?

月夜之吻
发布: 2025-08-20 17:12:02
原创
123人浏览过
.在XPath中代表当前上下文节点,用于基于当前位置进行相对路径导航,可明确指向当前元素以实现精准定位,常用于相对路径、谓语条件判断、函数参数中,如./span表示当前节点下的span子元素,//div[./@id='main']表示id属性为main的div,string(.)返回当前节点文本,..表示父节点可用于向上导航,.与轴和函数结合可提升表达式可读性与精确度,是XPath中基础且关键的语法符号。

xpath的.语法代表当前节点吗?

是的,XPath中的

.
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
语法,简单来说,就是代表当前上下文节点。它就像一个指路牌,永远指向你当前正在处理的那个元素或属性。理解这一点,是掌握XPath灵活定位能力的关键一步,因为它让你可以基于当前位置进行相对路径的导航,而不是每次都从文档的根部开始。

解决方案

在我看来,

.
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
是XPath里最基础也最容易被忽视,但同时又极度强大的一个符号。它的核心作用就是明确指出“我”当前所处的位置。想象一下,你正在一棵巨大的DOM树里穿梭,
.
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
就是你脚下站立的那片叶子或者那根树枝。

具体来说,当你在编写XPath表达式时,如果没有明确指定一个起始点,那么默认的上下文就是整个文档的根节点。但很多时候,我们希望在某个特定的元素内部进行查找,或者对某个元素本身进行条件判断。这时候,

.
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
就派上用场了。

比如,你可能有一个

<div>
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
元素,里面有很多
<span>
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
。如果你想找到这个
<div>
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
下面的所有
<span>
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
,你可以写
div/span
登录后复制
。但如果你的上下文已经是一个
<div>
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
元素了,你直接写
./span
登录后复制
就能达到同样的效果。这看起来只是少写了
div
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
,但实际上它改变了你的思考方式——从“在整个文档中找div再找span”变成了“在当前div中找span”。

更常见的,

.
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
会出现在谓语(
[]
登录后复制
登录后复制
)中。当你在一个谓语里使用
.
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
时,它指的是谓语所作用的那个节点本身。举个例子,
//div[./p]
登录后复制
表示查找所有包含
p
登录后复制
登录后复制
登录后复制
登录后复制
子元素的
div
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
。这里的
.
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
就代表了正在被检查的那个
div
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
元素。如果没有
.
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
,写成
//div[p]
登录后复制
效果是一样的,因为在谓语里,当前节点通常是隐式的。但显式地写上
.
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
有时候能让表达式的意图更清晰,尤其是在复杂的嵌套判断中。

它还能用于获取当前节点的文本内容,比如

string(.)
登录后复制
登录后复制
就会返回当前节点的文本值。或者在函数中作为参数,比如
contains(., '关键词')
登录后复制
,用来判断当前节点的文本是否包含某个关键词。这都是
.
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
作为“当前节点”的体现。

XPath中“.”与“..”的区别与应用场景

在XPath的导航体系里,

.
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
..
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
是两个非常基础且频繁使用的相对路径指示符,它们就像是你在文件系统里用
.
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
表示当前目录,用
..
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
表示父目录一样。

.
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
,如前所述,它就是你当前所在的节点。它的主要用途是在相对路径中明确当前上下文,或者在谓语中引用正在被筛选的节点。比如,当你已经定位到一个
<book>
登录后复制
登录后复制
元素时,如果你想获取它的
<title>
登录后复制
子元素,你可以写
./title
登录后复制
。这明确表示“在当前这个book节点下寻找title”。在谓语里,
//div[./@id='main']
登录后复制
意味着寻找那些自身
id
登录后复制
登录后复制
属性为
main
登录后复制
div
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
。虽然
//div[@id='main']
登录后复制
也能达到同样效果,但
.
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
的存在有时能帮助我们更好地理解表达式的意图,尤其是在处理更复杂的条件时。

..
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
则代表当前节点的父节点。它允许你向上导航。这在很多场景下都非常有用。想象一下,你定位到了一个
<author>
登录后复制
登录后复制
元素,现在你需要找到包含这个
<author>
登录后复制
登录后复制
的那个
<book>
登录后复制
登录后复制
元素。你就可以使用
../..
登录后复制
如果
author
登录后复制
book/details/author
登录后复制
这样的路径下,或者更直接地
ancestor::book
登录后复制
。但如果只是简单的父节点,
..
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
就足够了。比如,
//span[@class='price']/..
登录后复制
就能找到包含这个价格
span
登录后复制
登录后复制
登录后复制
的父元素,它可能是个
<div>
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
或者
<li>
登录后复制
登录后复制
登录后复制
。这种向上导航的能力,在处理层级结构不那么固定,或者你需要从子节点反推父节点信息时,显得尤为重要。

在我实际工作中,我发现

..
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
经常用于从一个特定子元素出发,去获取其父元素的一些属性或内容。例如,
//button[text()='提交']/../@id
登录后复制
,这表示找到文本为“提交”的按钮,然后获取其父元素的
id
登录后复制
登录后复制
属性。这种模式在处理表格数据或者列表项时尤其方便,因为你往往是从一个可识别的子元素(如一个链接、一个按钮)开始定位,然后向上回溯到包含它的行或项。

如何利用“.”在复杂XML/HTML结构中精准定位元素?

.
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
在复杂结构中精准定位元素的能力,主要体现在它与谓语(
[]
登录后复制
登录后复制
)以及其他XPath轴的结合使用上。这不仅仅是语法上的便利,更是一种思维上的转变,让你能够以当前节点为中心,向内、向外、向上、向下进行灵活的查询。

一个常见的场景是,你需要找到一个元素,它必须满足自身的一些条件,同时它的某个子元素也必须满足另一些条件。比如,我想找到所有

<div>
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
元素,这些
<div>
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
必须有一个
class
登录后复制
product
登录后复制
,并且它们内部还必须包含一个
<span>
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
元素,这个
<span>
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
的文本是“库存充足”。

传统的写法可能是:

//div[@class='product' and span[text()='库存充足']]
登录后复制
。这里
span[text()='库存充足']
登录后复制
里的
span
登录后复制
登录后复制
登录后复制
是相对于
div
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
的子元素。显式使用
.
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
可以让这个关系更明确:
//div[./@class='product' and ./span[text()='库存充足']]
登录后复制
。虽然在这个例子中,
./
登录后复制
可以省略,但当条件变得更复杂时,它的存在能帮助我们理清逻辑。

再举一个例子,假设你有一个列表,每个列表项

<li>
登录后复制
登录后复制
登录后复制
里面都有一个图片
<img>
登录后复制
和一段描述
<p>
登录后复制
。现在,你想找到那些描述文本中包含“特价”字样的列表项,并且这些列表项的图片
src
登录后复制
属性不能是空的。

你可以这样写:

//li[./p[contains(., '特价')] and ./img[not(@src='')]]
登录后复制
。 这里:

  • 第一个
    .
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    contains(., '特价')
    登录后复制
    中,它代表的是
    p
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    元素的文本内容。
  • 第二个
    .
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    ./p[...]
    登录后复制
    中,它代表的是正在被检查的
    li
    登录后复制
    登录后复制
    登录后复制
    元素。
  • 第三个
    .
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    ./img[...]
    登录后复制
    中,它也代表正在被检查的
    li
    登录后复制
    登录后复制
    登录后复制
    元素。

通过

.
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
,我们可以在
li
登录后复制
登录后复制
登录后复制
的上下文中,分别对
p
登录后复制
登录后复制
登录后复制
登录后复制
img
登录后复制
这两个子元素进行独立的条件判断,从而实现非常精确的筛选。这种组合查询的能力,是
.
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
在处理复杂文档结构时发挥其价值的关键。它让XPath表达式变得更加模块化和可读,因为每个谓语都可以被看作是对当前节点的一个独立验证。

“.”语法与其他XPath轴和函数结合使用的最佳实践

.
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
语法与其他XPath轴(如
parent::
登录后复制
,
ancestor::
登录后复制
,
preceding-sibling::
登录后复制
,
following-sibling::
登录后复制
等)和函数(如
count()
登录后复制
,
string()
登录后复制
,
name()
登录后复制
,
position()
登录后复制
等)结合使用,能够构建出极其强大和灵活的定位策略。这就像是给了你一套工具箱,
.
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
是你的基准点,其他轴和函数是你的测量工具和操作指令。

一个常见的实践是,当你定位到一个元素后,需要基于这个元素去查找其兄弟节点或者祖先节点,并且这些兄弟或祖先节点还需要满足特定的条件。

例如,你找到了一个特定的错误消息

<span>
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
,它的文本是“输入错误”。现在你想找到包含这个错误消息的表单字段
<input>
登录后复制
,它通常是错误消息的紧邻兄弟节点或者父节点的兄弟节点。

你可以尝试:

//span[text()='输入错误']/preceding-sibling::input[1]
登录后复制
。这里,
preceding-sibling::input[1]
登录后复制
是在
span
登录后复制
登录后复制
登录后复制
的上下文(也就是
.
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
)中查找紧邻的前一个
input
登录后复制
兄弟节点。

或者,如果你想找到某个

<div>
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
下的所有
<a>
登录后复制
登录后复制
链接,并且只选择那些
<a>
登录后复制
登录后复制
链接中
href
登录后复制
登录后复制
属性不为空的:
//div[@id='content']//a[./@href]
登录后复制
。这里的
.
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
就代表了正在被检查的每个
a
登录后复制
登录后复制
元素。
./@href
登录后复制
@href
登录后复制
更明确地表示“当前
a
登录后复制
登录后复制
元素的
href
登录后复制
登录后复制
属性”。

在函数中使用

.
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
也是一个非常普遍且高效的做法。比如,计算当前节点下有多少个
<li>
登录后复制
登录后复制
登录后复制
子元素:
count(./li)
登录后复制
。或者,检查当前节点的名称是否是
div
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
name(.) = 'div'
登录后复制
。这些看似简单的组合,在实际抓取或解析任务中,能大大简化逻辑,提高表达式的精确度。

我个人在使用时,倾向于在谓语中显式使用

.
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
,尤其当谓语内部还有更复杂的条件或者涉及到多个轴的时候。这能帮助我快速理解每个部分是针对哪个上下文在进行判断。例如,
//div[./@class='card' and ./p[contains(string(.), '详情')]]
登录后复制
。这里的
string(.)
登录后复制
登录后复制
明确表示获取
p
登录后复制
登录后复制
登录后复制
登录后复制
元素的文本内容。虽然很多时候可以省略
.
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
,但显式地写出来,对阅读和维护而言,有时反而是一种“最佳实践”,因为它减少了歧义,让意图一目了然。这种做法尤其在团队协作或者未来回顾自己代码时,能节省不少时间。

以上就是XPath的.语法代表当前节点吗?的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 //m.sbmmt.com/ All Rights Reserved | php.cn | 湘ICP备2023035733号